首页 > 解决方案 > 用 Jest 测试一个调度 2 个其他函数的 Redux 操作?

问题描述

我有一个调用 2 个函数的函数(一个 Redux 操作)。我不知道如何用 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 
    })

})

标签: reduxjestjs

解决方案


看起来您想要模拟默认导出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.mockbabel-jest调用在代码文件中的所有其他内容之前被提升并运行。提升在测试函数中定义时无法正常工作jest.mock,因此jest.mock应将调用移至测试文件的顶级范围。

被测函数async因此使用async测试函数并await确保Promise它在断言之前已完成。


推荐阅读