如何从Jest手动模拟中检查默认导出功能

时间:2020-07-31 11:13:04

标签: javascript typescript jestjs fetch

以下用于Jest测试的isomorphic-fetch手动模拟文件返回期望值:

// __mocks__/isomorphic-fetch.ts

import * as req from "./requestData";

const Fetch = (url: string, options: any): Promise<any> => {
  const resultPromise = {
    text: () => {
      return Promise.resolve(req.generateMockResponseData(url, options.body));
    },
  };
  return Promise.resolve(resultPromise);
};

export default Fetch;

但是,在尝试检查调用它的参数时,我遇到了问题,因为mock的{​​{1}}属性是未定义的。我已经尝试了两件事:

首先,我将fetch函数包装在Fetch中,如下所示:

jest.fn

现在添加后

const Fetch = jest.fn((url: string, options: any): Promise<any> => {
// implementation is same as above
});

export default Fetch;

在测试文件中,我可以检查使用进行提取的调用

import _fetchMock  from "isomorphic-fetch"
const fetchMock = _fetchMock as jest.Mock<Promise<any>>;

但是现在由于某种原因,应用程序代码中的fetchMock.mock.calls[0] 返回未定义的状态。

我尝试的第二件事是从fetch移除jest.fn包装器并添加

Fetch

到测试文件。现在jest.mock("isomorphic-fetch") 在测试过程中返回应用程序代码中的期望值,但是fetch现在再次未定义。

最佳配置:

fetchMock.mock

GitHub.

上有一个完整的示例

1 个答案:

答案 0 :(得分:1)

Jest间谍和常规模拟函数在相同的实现方式下可能会表现出不同的原因是Jest间谍可以重置为无操作。

这正是在Jest设置中发生的事情:

...
"resetMocks": true,
"restoreMocks": true,
...

restoreMocks选项通常是可取的,它通过将间谍方法重置为原始实现来防止测试交叉污染。

resetMocks通常是不可取的,并且实际上是不可用的,它会将可重复使用的间谍从__mocks__重置为无操作实现。

TL; DR:resetMocks配置选项和jest.resetAllMocks()破坏了可重复使用间谍程序的实现,通常应避免使用。如果需要重置特定的间谍,可以使用mockReset方法根据具体情况进行重置。