【问题标题】:sinon.spy returns false on an imported function, even though the function gets calledsinon.spy 在导入的函数上返回 false,即使该函数被调用
【发布时间】:2017-01-11 20:32:05
【问题描述】:

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

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.call 仍然返回 false。

我做错了什么?

【问题讨论】:

    标签: reactjs sinon jestjs


    【解决方案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 的对象,这是间谍。通过在您的测试中导入模块,您也可以测试它是否被调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多