【问题标题】:Mock imports to test function logic模拟导入以测试功能逻辑
【发布时间】:2018-07-31 02:52:43
【问题描述】:

假设我有以下文件。

此文件从库中导入promiseFunction,我想测试doSomething() 函数。

特别是,当 Promise 解决或失败时断言状态

// file: MyComponent.js

import promiseFunction from 'somewhere';

class MyClass extends Component {

  doSomething = () => {

    promiseFunction()
      .then((data) => {

        this.setState({...this.state, name: data.name});

      }.catch(() => {

        this.setState({...this.state, error: 'error'});

      });

  }
}

我如何模拟正在导入的promiseFunction。或者实际上只是任何正在导入的函数。

// file: MyClass.spec.js
it('sets error in state when doSomething() is rejected', () => {
  const wrapper = shallow(<MyClass />);

  // How do I mock promiseFunction here?
  wrapper.instance().doSomething();

  expect(wrapper.state().error).toEqual('error');
});

【问题讨论】:

    标签: javascript testing jestjs sinon enzyme


    【解决方案1】:

    您可以将spyOnmockImplementation 结合使用

    这是一个工作示例:

    // ---- somewhere.js ----
    const promiseFunction = () => {
      return Promise.resolve({name: 'name from promiseFunction'});
    }
    export default promiseFunction;
    
    
    
    // ---- myclass.js ----
    import * as React from 'react';
    import promiseFunction from './somewhere';
    
    export class MyClass extends React.Component {
      doSomething = () => {
        // return the Promise so the test can wait for it
        return promiseFunction()
          .then((data) => {
            this.setState({...this.state, name: data.name});
          }).catch(() => {
            this.setState({...this.state, error: 'error'});
          });
      }
      render() {
        return <div>This is MyClass</div>;
      }
    }
    
    
    
    // ---- myclass.test.js ----
    import { shallow } from 'enzyme';
    import * as React from 'react';
    import { MyClass } from './myclass';
    import * as somewhere from './somewhere';
    
    describe('MyClass', () => {
      it('sets error in state when promiseFunction rejects', async () => {
        // set up mock for promiseFunction
        const mock = jest.spyOn(somewhere, 'default');
        mock.mockImplementation(() => Promise.reject());
    
        const wrapper = shallow(<MyClass />);
    
        await wrapper.instance().doSomething();
    
        expect(wrapper.state().error).toEqual('error');
    
        // restore promiseFunction
        mock.mockRestore();
      });
    });
    

    【讨论】:

      猜你喜欢
      • 2013-09-01
      • 2015-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-14
      • 1970-01-01
      • 2019-07-22
      相关资源
      最近更新 更多