我正在尝试使用Jest测试React组件。在组件中,需要一个模块,它是一个返回函数对象的工厂函数。
//tracker.js
export default () => {
track: click => dosomething(click);
};
//component.js
import Tracker from './tracker';
const tracker = Tracker();
tracker.track();
//__tests__/component.test.js
import component from '../component';
describe('', () => {
it('tracks the click', () => {
const mockTrack = jest.fn();
jest.mock('../tracker', () => () => ({
track: mockTrack
}));
// do some testing...
expect(mocktrackData).toHaveBeenCalledWith(constants.TRACKING);
});
});
这似乎有效,但是导入到组件中的跟踪器文件不是我的模拟也不是原始文件,而是基于原始跟踪文件的API的Jest默认模拟。
我在同一个文件中进行了一些测试,我想测试不同的args被发送到跟踪器。
这可能吗?我在这里做错了什么?
这是伪代码,但足以传达意图。
答案 0 :(得分:0)
工厂只是你可以模仿的另一种方法:
// tracker.js
module.exports = () => ({
track: () => {
console.log('track implementation');
}
});
// index.js
const Tracker = require('./tracker');
const index = () => {
const tracker = Tracker();
tracker.track();
};
module.exports = {
index
};
// index.test.js
jest.mock('./tracker');
const { index } = require('./index');
const Tracker = require('./tracker');
it('should call mocked track', () => {
const track = jest.fn(() => {
console.log('track mock');
});
Tracker.mockImplementation(() => ({ track }));
index();
expect(track).toBeCalled();
});