如何在jest测试中访问mockmodule

时间:2018-04-09 06:10:21

标签: javascript mocking jestjs enzyme

我不明白如何访问我在测试中使用的模拟模块的实例。下面你可以找到我的测试代码,我在那里嘲笑" 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实例与我的组件中的不同。我甚至有办法访问它或者我的架构是错误的吗?

感谢您输入:)

1 个答案:

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