我正在使用Jest来模拟某个模块中的某些函数,并按以下方式进行测试:
jest.mock("module", () => ({
funcOne: jest.fn(),
funcTwo: jest.fn(),
...
}));
import {funcOne, funcTwo, ...} from "module";
test("something when funcOne returns 'foo'", () => {
funcOne.mockImplementation(() => 'foo'); // <- Flow error
expect(...)
});
test("that same thing when funcOne returns 'bar'", () => {
funcOne.mockImplementation(() => 'bar'); // <- Flow error
expect(...)
});
如何阻止Flow报告 property 'mockImplementation' not found in statics of function
错误而不会出现错误抑制(例如$FlowFixMe
)?
我理解这个问题来自于模块中定义的函数不是Jest-mocked函数,并且就Flow而言,不包含mockImplementation
,mockReset
等方法。等等。
答案 0 :(得分:4)
谢谢Andrew Haines,您发布的related issue评论提供了解决方案。我对以下内容感到满意:
const mock = (mockFn: any) => mockFn;
test("something when funcOne returns 'foo'", () => {
mock(funcOne).mockImplementation(() => 'foo'); // mo more flow errors!
...
});
答案 1 :(得分:2)
我建议使用any
类型,而不是使用JestMockFn
抑制错误。这是一个相关的问题:https://github.com/flow-typed/flow-typed/issues/291
示例(从上面的链接复制):
import ajax from '../../js/comm/ajax';
jest.mock('../../js/comm/ajax', () => {
return {
default: jest.fn(),
}
});
const mockAjax: JestMockFn<[string], Promise<{body: {}}>> = ajax;
describe('ConfigurationProvider', () => {
it('calling the fetchConfig() should return a promise', () => {
const expectedCfg = {x:'y'};
mockAjax.mockReturnValueOnce(
Promise.resolve({body:expectedCfg})
);
...
});
});
以下是最新玩笑版本中对类型的定义:https://github.com/flow-typed/flow-typed/blob/master/definitions/npm/jest_v25.x.x/flow_v0.104.x-/jest_v25.x.x.js
请注意,该类型是全局类型,不必导入(我认为这是不幸的决定,但这是一个不同的主题)。
答案 2 :(得分:0)
您也可以内联放松类型约束:
test("something when funcOne returns 'foo'", () => {
(funcOne: any).mockImplementation(() => 'foo'); // mo more flow errors!
...
});