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

Reactjs sinon.spy对导入的函数返回false,即使该函数被调用,reactjs,sinon,jestjs,Reactjs,Sinon,Jestjs,我有一个从另一个文件导入的函数: import { getMenu } from '../utils/request'; 然后我有一个方法调用这个我想测试的函数(我想测试这个方法是否真的调用了这个函数): it('handleDateChange在未超过状态日期时应调用getMenu',()=>{ const dashboard=shallow(); const today=新日期(); var spy=sinon.spy(getMenu); dashboard.setState({selec

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

import { getMenu } from '../utils/request';
然后我有一个方法调用这个我想测试的函数(我想测试这个方法是否真的调用了这个函数):

it('handleDateChange在未超过状态日期时应调用getMenu',()=>{
const dashboard=shallow();
const today=新日期();
var spy=sinon.spy(getMenu);
dashboard.setState({selectedDate:'blah'});
dashboard.instance().handleDateChange(今天);
期望(间谍.呼叫).toBe(真实);
});
有趣的是,我从getMenu方法获得了一些控制台输出,因此我知道该方法已被调用

但间谍称仍归假


我做错了什么?

问题是,你不能用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();
});
从“../utils/request”导入{getMenu};
mock('../utils/request',()=>({getMenu:jest.fn()}))
它('handleDateChange在未超过状态日期时应调用getMenu',()=>{
const dashboard=shallow();
const today=新日期();
dashboard.setState({selectedDate:'blah'});
dashboard.instance().handleDateChange(今天);
expect(getMenu).toHaveBeenCalled();
});
因此,首先我们导入模块,然后模拟它,以便
getMenu
是一个玩笑间谍。请注意,当测试运行all
jest.mock
调用时,在所有导入内容发生之前就会调用,因此在您的测试和您要测试的模块中,
请求
模块只是一个带有间谍的对象。通过在您的测试中导入模块,您可以测试它是否被调用

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();
});