使用Jest测试分派其他2个功能的Redux动作?

时间:2019-05-09 09:31:37

标签: redux jestjs

我有一个函数(Redux动作),它调用2个函数。我不知道如何用Jest进行测试:

这是我的功能:

import doSomething from 'redux/do-something';
import doSomethingElse from 'redux/do-something-else';

export default () => async dispatch => {
  await dispatch(doSomething());
  dispatch(doSomethingElse());
};

这是我的测试

import doSomething from 'redux/do-something';
import doSomethingElse from 'redux/do-something-else';

import functionToTest from 'redux/function-to-test'

describe("functionToTest", ()=>{
    jest.mock('redux/do-something');
    jest.mock('redux/do-something-else');
    const dispatch = jest.fn();

    test('my test', ()=>{
        functionToTest()(dispatch);
        console.log(dispatch.mock.calls); // This returns an anonymous function
        console.log(doSomething) // This returns undefined 
    })

})

1 个答案:

答案 0 :(得分:2)

您似乎想模拟do-somethingdo-something-else的默认导出,并测试它们是否被测试代码调度了。

如果是这种情况,那么您可以这样做:

import functionToTest from 'redux/function-to-test'

jest.mock('redux/do-something', () =>
  () => 'do something mock'
);
jest.mock('redux/do-something-else', () =>
  () => 'do something else mock'
);

describe("functionToTest", () => {
  test('my test', async () => {  // <= async test function
    const dispatch = jest.fn();
    await functionToTest()(dispatch);  // <= await the Promise
    expect(dispatch.mock.calls[0][0]).toBe('do something mock');  // Success!
    expect(dispatch.mock.calls[1][0]).toBe('do something else mock');  // Success!
  });
});

详细信息

您可以将模块工厂函数作为第二个参数传递给jest.mockJest将使用调用函数的结果作为在测试期间导入模块时返回的结果。

jest.mock调用被babel-jest挂起,并在代码文件中的所有其他命令之前运行。吊起doesn't work right when jest.mock is defined in a test function,因此jest.mock调用应移至测试文件的顶级范围。

被测函数为async,因此请使用async测试函数和await的{​​{1}}以确保其在断言之前已完成。