我想测试令牌值为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()做到这一点,但是所有示例都是模拟函数。在这里,我需要在测试之间更改字符串值。我该怎么办?
答案 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
。