sinon.spy在导入的函数上返回false,即使该函数被调用

时间:2017-01-11 20:32:06

标签: reactjs sinon jestjs

我有一个我从另一个文件导入的函数:

import { getMenu } from '../utils/request';

然后我有一个方法调用我要测试的这个函数(我想测试该方法真的调用这个函数):

it('handleDateChange should call getMenu when NOT passed state date', ()=> {
    const dashboard = shallow(<Dashboard/>);
    const today = new Date();

    var spy = sinon.spy(getMenu);

    dashboard.setState({ selectedDate: 'blah' });

    dashboard.instance().handleDateChange(today);
    expect(spy.called).toBe(true);
  });

有趣的是,我从getMenu方法获得了一些控制台输出,所以我知道该方法已被调用。

但是spy.called仍然是假的。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

问题是你不能用sinon模拟模块中的东西,如果这个模块被导入,这对其他地方有任何影响。因此,您只监视测试中导入的函数。使用jest时的解决方案是模拟模块并将其导入测试中。

import { getMenu } from '../utils/request';

jest.mock('../utils/request', () => ({getMenu: jest.fn()}))

it('handleDateChange should call getMenu when NOT passed state date', ()=> {
    const dashboard = shallow(<Dashboard/>);
    const today = new Date();

    dashboard.setState({ selectedDate: 'blah' });

    dashboard.instance().handleDateChange(today);
    expect(getMenu).toHaveBeenCalled();
});

首先我们导入模块,然后我们模拟它,以便getMenu是一个开玩笑的间谍。请注意,当测试运行时,所有jest.mock调用都会在所有导入事件发生之前被调用,因此在您的测试和要测试的模块中,request模块只是getMenu模块的对象{{ 1}}这是间谍。通过在测试中导入模块,您可以测试它是否被调用。