测试是否调用了模块方法

时间:2020-05-16 20:17:23

标签: javascript unit-testing redux mocking jestjs

我一直在尝试测试我的代码,但是没有成功。要测试我的代码,我需要模拟一个模块,但是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方法。

1 个答案:

答案 0 :(得分:0)

这是单元测试解决方案:

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
相关问题