【问题标题】:Testing if module method has been called测试是否调用了模块方法
【发布时间】:2020-05-18 12:21:19
【问题描述】:

我一直在尝试测试我的代码,但没有成功。要测试我的代码,我需要模拟一个模块,但 toHaveBeenCalledTimes 的结果为 0。

我要测试的代码:

import { createStore } from 'redux';

const store = createStore()

const import = (dispatch) => (
  data
) => {
  validate(data);

  dispatch(someMethod(true))
};

const importer = import(store.dispatch);

export { importer };

我写的测试:

import { createStore } from 'redux';

jest.mock('redux', () => ({
  createStore: jest.fn(() => ({
    dispatch: jest.fn()
  })),
}));

describe('store module', () => {

  let storeImp;

  beforeEach(() => {
    jest.resetModules();
    jest.resetAllMocks();

    storeImp = require('./store');
  });

  it('should create the store', () => {
    expect(createStore).toHaveBeenCalledTimes(1);
  });

it('should import a valid datastructure', () => {
    const dispatchMock = jest.fn();

    createStore.mockImplementation(() => ({
      dispatch: dispatchMock,
    }));

    const data = {
      something: "data1"
    };

    storeImp.importer(data);

    expect(dispatchMock).toHaveBeenCalledTimes(1);
  });
});

我一直被这个问题困扰。我想测试是否调用了 createStore 和 store.dispatch 方法。

【问题讨论】:

    标签: javascript unit-testing redux mocking jestjs


    【解决方案1】:

    这里是单元测试解决方案:

    store.ts:

    import { createStore } from 'redux';
    
    function reducer(state) {
      return state;
    }
    const store = createStore(reducer);
    
    function validate(data) {
      return !!data;
    }
    
    function someMethod(flag) {}
    
    const dataImport = (dispatch) => (data) => {
      validate(data);
    
      dispatch(someMethod(true));
    };
    
    const importer = dataImport(store.dispatch);
    
    export { importer };
    

    store.test.ts:

    import { createStore } from 'redux';
    
    jest.mock('redux', () => {
      const mStore = {
        dispatch: jest.fn(),
      };
      return {
        createStore: jest.fn(() => mStore),
      };
    });
    
    describe('store module', () => {
      let storeImp;
    
      beforeEach(() => {
        storeImp = require('./store');
      });
    
      it('should create the store', () => {
        expect(createStore).toHaveBeenCalledTimes(1);
      });
    
      it('should import a valid datastructure', () => {
        const reducer = () => '';
        const mStore = createStore(reducer);
    
        const data = {
          something: 'data1',
        };
        storeImp.importer(data);
        expect(mStore.dispatch).toHaveBeenCalledTimes(1);
      });
    });
    

    带有覆盖率报告的单元测试结果:

     PASS  stackoverflow/61843011/store.test.ts (9.139s)
      store module
        ✓ should create the store (6454ms)
        ✓ should import a valid datastructure (1ms)
    
    ----------|---------|----------|---------|---------|-------------------
    File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
    ----------|---------|----------|---------|---------|-------------------
    All files |      90 |      100 |      80 |   88.89 |                   
     store.ts |      90 |      100 |      80 |   88.89 | 4                 
    ----------|---------|----------|---------|---------|-------------------
    Test Suites: 1 passed, 1 total
    Tests:       2 passed, 2 total
    Snapshots:   0 total
    Time:        10.457s
    

    【讨论】:

      猜你喜欢
      • 2012-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-29
      • 1970-01-01
      • 1970-01-01
      • 2019-07-24
      相关资源
      最近更新 更多