每次测试的笑话模拟值

时间:2018-10-22 04:55:58

标签: reactjs testing mocking jestjs babel-jest

我想测试令牌值为null时是否未调用库函数。为此,我必须在单元测试之间更改GOOGLE_ANALYTICS_TRACKING_ID的模拟值。它存储在如下所示的“ config.js”中:

module.exports = {
  GOOGLE_ANALYTICS_TRACKING_ID: process.env.GOOGLE_ANALYTICS_TRACKING_ID
};

它也由HOC的withGoogleAnalytics使用。在其中,我以这种方式导入配置:

import { GOOGLE_ANALYTICS_TRACKING_ID } from 'config';

我的测试如下:

import React from 'react';
import { shallow } from 'enzyme';
import ReactGA from 'react-ga';

import withGoogleAnalytics from '../withGoogleAnalytics';

jest.mock('react-ga', () => ({
  pageview: jest.fn(),
  initialize: jest.fn()
}));

jest.mock('config', () => ({ GOOGLE_ANALYTICS_TRACKING_ID: '123' }));

const Component = withGoogleAnalytics(() => <div />);

describe('HOC withGoogleAnalytics', () => {
  describe('render', () => {
    const shallowWrapper = shallow(<Component />);

    it('should fire initialize action', () => {
      expect(ReactGA.initialize).toHaveBeenCalledWith('123');
    });

    it('should have pageview prop set', () => {
      expect(shallowWrapper.prop('pageview')).toBe(ReactGA.pageview);
    });

    it('should not fire initialize action', () => {
      expect(ReactGA.initialize).not.toHaveBeenCalled();
    });
  });
});

从我在StackOverflow和GitHub上阅读的内容来看,我应该能够使用jest.resetModules()和jest.mockImplementation()做到这一点,但是所有示例都是模拟函数。在这里,我需要在测试之间更改字符串值。我该怎么办?

1 个答案:

答案 0 :(得分:0)

应在jest.mock之后导入依赖于模拟模块的模块。如果import位于模块范围内,并且每次测试完成jest.mock,则不会发生这种情况。

为整个诉讼分配一次shallowWrapper很不好,并且会导致测试交叉污染。

应该是:

let shallowWrapper;
let withGoogleAnalytics;

beforeEach(async () => {
  shallowWrapper = shallow(<Component />)
  jest.mock('config', () => ({ GOOGLE_ANALYTICS_TRACKING_ID: '123' }));
  withGoogleAnalytics = (await import('../withGoogleAnalytics')).default;
});

如果需要使用另一个GOOGLE_ANALYTICS_TRACKING_ID值进行测试,则可以创建另一个describe,其块具有不同的beforeEach