在这个Jest模拟中,为什么我的实现不会在组件上使用?

时间:2018-01-09 03:03:04

标签: javascript reactjs unit-testing jestjs

我正在尝试使用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被发送到跟踪器。

这可能吗?我在这里做错了什么?

这是伪代码,但足以传达意图。

1 个答案:

答案 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();
});