jest.fn() 有什么作用,我该如何使用它? [英] What does jest.fn() do and how can I use it?

查看:186
本文介绍了jest.fn() 有什么作用,我该如何使用它?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

谁能用一个真实世界的例子来解释 jest.fn() 实际上是如何工作的,因为我对如何使用它以及必须在哪里使用它感到困惑.

例如,如果我有一个组件 Country,它可以在 Utils 功能的帮助下单击按钮获取国家列表

export default class countries extends React.Component {构造函数(道具){超级(道具)this.state = {国家列表:''}}获取列表(){//e.preventDefault();//在这里做一个api调用让列表 = getCountryList();list.then((response)=>{ this.setState({ countryList:response }) });}使成为() {var cListing = "单击按钮加载国家列表";如果(this.state.countryList){让 cList = JSON.parse(this.state.countryList);cListing = cList.RestResponse.result.map((item)=> { return(
  • {item.name}
  • ); });}返回 (<div><button onClick={()=>this.getList()} className=buttonStyle">显示国家列表 </button><ul>{cListing}

    );}}

    使用的Utils函数

    const http = require('http');导出函数 getCountryList() {返回新的承诺(解决 => {让 url = "/country/get/all";http.get({host:'services.groupkt.com',path: url,withCredentials:false}, response => {让数据 = '';response.on('data', _data => data += _data);response.on('end', () => resolve(data));});});}

    我可以在哪里使用 Jest.fn() 或者我如何测试当我点击按钮时调用 getList 函数

    解决方案

    Jest Mock 函数

    模拟函数也被称为间谍",因为它们让您可以监视由其他代码间接调用的函数的行为,而不仅仅是测试输出.您可以使用 jest.fn() 创建一个模拟函数.

    检查 jest.fn() 的文档

    返回一个新的、未使用的模拟函数.可选地采用模拟实现.

     const mockFn = jest.fn();模拟Fn();期望(mockFn).toHaveBeenCalled();

    使用模拟实现:

     const returnsTrue = jest.fn(() => true);console.log(returnsTrue())//true;


    所以你可以使用 jest.fn() 模拟 getList 如下:

    jest.dontMock('./Countries.jsx');const React = require('react/addons');const TestUtils = React.addons.TestUtils;const Country = require('./Countries.jsx');描述('组件',函数(){it('必须在点击按钮时调用 getList', function() {var renderNode = TestUtils.renderIntoDocument();renderNode.prototype.getList = jest.fn()var button = TestUtils.findRenderedDOMComponentWithTag(renderedNode, 'button');TestUtils.Simulate.click(button);期望(renderedNode.prototype.getList).toBeCalled();});});

    Can anyone explain how jest.fn() actually works, with a real world example, as I'm confused on how to use it and where it has to be used.

    For example if I have the component Countries which fetches country List on click of a button with help of the Utils Function

    export default class Countries extends React.Component {
      constructor(props) {
        super(props)
    
        this.state = {
          countryList:''
        }
      }
    
      getList() {
        //e.preventDefault();
        //do an api call here
        let list = getCountryList();
        list.then((response)=>{ this.setState({ countryList:response }) });
      }
    
      render() {
    
        var cListing = "Click button to load Countries List";
    
        if(this.state.countryList) {
          let cList = JSON.parse(this.state.countryList);
          cListing = cList.RestResponse.result.map((item)=> { return(<li key={item.alpha3_code}> {item.name} </li>); });
        }
    
        return (
          <div>
            <button onClick={()=>this.getList()} className="buttonStyle"> Show Countries List </button>
            <ul>
              {cListing}
            </ul>
          </div>
        );
    
      }
    }
    

    Utils function used

    const http = require('http');
    
    
        export function getCountryList() {
          return new Promise(resolve => {
            let url = "/country/get/all";
            http.get({host:'services.groupkt.com',path: url,withCredentials:false}, response => {
              let data = '';
              response.on('data', _data => data += _data);
              response.on('end', () => resolve(data));
            });
          });
        
        
        }
    

    where could i use Jest.fn() or how can i test for getList function is called when i click on the Button

    解决方案

    Jest Mock Functions

    Mock functions are also known as "spies", because they let you spy on the behavior of a function that is called indirectly by some other code, rather than just testing the output. You can create a mock function with jest.fn().

    Check the documentation for jest.fn()

    Returns a new, unused mock function. Optionally takes a mock implementation.

      const mockFn = jest.fn();
      mockFn();
      expect(mockFn).toHaveBeenCalled();
    

    With a mock implementation:

      const returnsTrue = jest.fn(() => true);
      console.log(returnsTrue()) // true;
    


    So you can mock getList using jest.fn() as follows:

    jest.dontMock('./Countries.jsx');
    const React = require('react/addons');
    const TestUtils = React.addons.TestUtils;
    const Countries = require('./Countries.jsx');
    
    describe('Component', function() {
      it('must call getList on button click', function() {
        var renderedNode = TestUtils.renderIntoDocument(<Countries />);
        renderedNode.prototype.getList = jest.fn()
    
        var button = TestUtils.findRenderedDOMComponentWithTag(renderedNode, 'button');
    
        TestUtils.Simulate.click(button);
    
        expect(renderedNode.prototype.getList).toBeCalled();
      });
    });
    

    这篇关于jest.fn() 有什么作用,我该如何使用它?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆