我不明白如何访问我在测试中使用的模拟模块的实例。下面你可以找到我的测试代码,我在那里嘲笑" highcharts"图书馆和高级图表的扩展称为"漏斗"。漏斗只是您在Highcharts上调用的功能,例如漏斗(Highcharts)扩展了Highcharts。我嘲笑这个功能,因为我有一个问题,我需要测试我没有在Highcharts上多次调用该函数,因为这会导致意外行为,有时会导致Highcharts崩溃。这是我的测试代码:
import React, {PureComponent} from 'react';
import {mount} from 'enzyme';
import Highcharts from 'highcharts/js/highcharts';
// mocking the highcharts modules
jest.mock('highcharts/js/highcharts', () => ({
Chart: jest.fn(),
setOptions: jest.fn(),
seriesTypes: {},
}));
// mocking an extension
jest.mock('highcharts/js/modules/funnel.src.js', function() {
return function mockHighcharts(mockHighcharts) {
const localMock = {...{}, ...mockHighcharts};
localMock.seriesTypes.funnel = jest.fn();
return localMock;
};
});
describe('Chart', () => {
class Tester extends PureComponent {
render() {
return null;
}
}
// Each Chart needs at least one child hence the Tester component
it.only('should render', () => {
const component = mount(
<Chart type="funnel">
<Tester />
</Chart>,
Highcharts
);
expect(component).toMatchSnapshot();
});
});
我不明白如何访问模拟的Highcharts模块,以查看我的模拟函数是否在模拟导入上被调用。当我在Chart组件(我在这里测试的组件)中调试并检查它的状态时,我可以看到测试使用我的模拟模块并在其上调用我的模拟函数。但我的问题是,当我挂载组件时,我只有这种状态,但我无法在测试中访问导入的状态,因此不会断言我的测试行为。
您可以在下面找到我的图表的简化版本。我有可以在需要时动态加载某些扩展的功能(在这个简化版本中,我只是总是加载漏斗,除非它已经加载)。
import React, {Component} from 'react';
import PropTypes from 'prop-types';
import Highcharts from 'highcharts/js/highcharts';
export default class Chart extends Component {
state = {
chart: {
// my chart options
}
}
componentDidMount() {
if (!Highcharts.seriesTypes.funnel) {
import('highcharts/js/modules/funnel.src.js').then((funnel) => funnel(Highcharts));
}
this.instance = Highcharts.Chart('myChart', this.state.chart);
}
render() {
return (
<div id="myChart" />
);
}
}
我喜欢做的事情就像
expect(Highcharts).toMatchSnapshot();
但是当我挂载时,我的测试中的Highcharts实例与我的组件中的不同。我甚至有办法访问它或者我的架构是错误的吗?
感谢您输入:)
答案 0 :(得分:0)
如果您模拟这样的模块
jest.mock('./myMockedModule', ()=>jest.fn())
您可以通过导入模块来访问它们:
import MockedModule from './myMockedModule'
const mockedFunction = jest.fn()
const Mock = {mockedFunction}
MockedModule.mockImplementation(Mock)
Mock.mockedFunction()
expect(mockedFunction).toHaveBeenCalledOnce()