我有一个函数(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
})
})
答案 0 :(得分:2)
您似乎想模拟do-something
和do-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.mock
,Jest
将使用调用函数的结果作为在测试期间导入模块时返回的结果。
jest.mock
调用被babel-jest
挂起,并在代码文件中的所有其他命令之前运行。吊起doesn't work right when jest.mock
is defined in a test function,因此jest.mock
调用应移至测试文件的顶级范围。
被测函数为async
,因此请使用async
测试函数和await
的{{1}}以确保其在断言之前已完成。