sinon.spy returns 对导入的函数为 false,即使该函数被调用
sinon.spy returns false on an imported function, even though the function gets called
我有一个从另一个文件导入的函数:
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仍然return错误。
我做错了什么?
问题是你不能用 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
的对象是间谍。通过在您的测试中导入模块,您也可以测试它是否被调用。
我有一个从另一个文件导入的函数:
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仍然return错误。
我做错了什么?
问题是你不能用 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
的对象是间谍。通过在您的测试中导入模块,您也可以测试它是否被调用。