如何从Jest模拟中解决Flow类型错误

时间:2017-07-11 01:17:53

标签: javascript jestjs flowtype

我正在使用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而言,不包含mockImplementationmockReset等方法。等等。

3 个答案:

答案 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!
    ...
});