我需要测试这个功能:
import dependency from 'dependency';
export default values => (dispatch) => {
dispatch(dependency(values));
// More code
};
我有一个测试,断言 dispatch
调用了 dependency
:
import functionToTest from 'function-to-test';
jest.mock('dependency', () => () => 'dependency res');
describe('functionToTest', () => {
const dispatch = jest.fn();
functionToTest({ foo: 'bar' })(dispatch);
test('test', () => {
expect(dispatch.mock.calls[0][0]).toBe('dependency res');
});
});
我需要断言 dependancy
是通过 { foo: 'bar' }
调用的。我尝试命名我的依赖模拟,但是当我 console.log
时,它是未定义的:
import functionToTest from 'function-to-test';
const dependencyMock = jest.mock('dependency', () => () => 'dependency res');
describe('functionToTest', () => {
const dispatch = jest.fn();
functionToTest({ foo: 'bar' })(dispatch);
test('test', () => {
expect(dispatch.mock.calls[0][0]).toBe('dependency res');
console.log(dependencyMock.mock.calls) // undefined
});
});
我尝试创建一个新的 Jest 函数 spy
希望我可以检查它的参数,但这返回了一个错误
import functionToTest from 'function-to-test';
const spy = jest.fn(() => 'save-form-data');
const dependencyMock = jest.mock('dependency', () => spy);
describe('functionToTest', () => {
const dispatch = jest.fn();
functionToTest({ foo: 'bar' })(dispatch);
test('test', () => {
expect(dispatch.mock.calls[0][0]).toBe('dependency res');
console.log(dependencyMock.mock.calls) // undefined
});
});
The module factory of
jest.mock()
is not allowed to reference any out-of-scope variables.
最佳答案
你已经很接近了!
您需要将模拟函数移动到传递给jest.mock
的模块工厂函数内。
然后您只需将 dependency
导入到测试中并检查它是否按预期调用:
import functionToTest from 'function-to-test';
import dependency from 'dependency'; // <= dependency will be...
jest.mock('dependency', () =>
jest.fn(() => 'dependency res') // <= ...this mock function
);
describe('functionToTest', () => {
it('should dispatch dependency', () => {
const dispatch = jest.fn();
functionToTest({ foo: 'bar' })(dispatch);
expect(dispatch.mock.calls[0][0]).toBe('dependency res'); // Success!
expect(dependency).toHaveBeenCalledWith({ foo: 'bar' }); // Success!
});
});
请注意,默认情况下,babel-jest
提升 jest.mock
调用,并且它们在测试文件中的其他任何内容之前运行,因此模块工厂函数传递给 jest .mock
必须完全独立。
关于javascript - 使用 Jest 模拟依赖项中的依赖项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56082239/