如何在与Jest的react-native中使用模拟fetch()对API调用进行单元测试

J T*_*J T 33 unit-testing jestjs react-native

在React Native中我fetch用来执行网络请求,但fetch不是一个明确需要的模块,因此在Jest中模拟似乎是不可能的.

即使尝试调用fetch在测试中使用的方法也会导致:

ReferenceError:未定义fetch

有没有办法在Jest的原生反应中测试这样的API请求?

Ale*_*eev 28

在你的测试用例中,你可以使用Jest的模拟来模拟你想要的任何函数:

fetch = jest.fn(() => Promise.resolve());
Run Code Online (Sandbox Code Playgroud)

此方法仅适用于基于承诺的测试用例(请参阅pitJest文档).

fetch异步函数而言,您需要使用所有测试运行pit(在此处阅读有关异步测试的更多信息).

  • 仅供参考,您现在可以通过返回Promise来使用`it`. (3认同)

jhm*_*jhm 10

模拟全局fetch对象的另一种方法:

const mockSuccesfulResponse = (
  status = 200,
  method = RequestType.GET,
  returnBody?: object
) => {
  global.fetch = jest.fn().mockImplementationOnce(() => {
    return new Promise((resolve, reject) => {
      resolve({
        ok: true,
        status,
        json: () => {
          return returnBody ? returnBody : {};
        },
      });
    });
  });
};
Run Code Online (Sandbox Code Playgroud)

上面的帮助方法可以任何你想要的方式修改:-)希望它可以帮助某人

  • global.fetch = jest.fn(() => Promise.resolve()); 这也有效! (2认同)

Art*_*ure 7

您可以使用jest-fetch-mock npm包覆盖全局提取对象,而不是滚动自己的mock .该软件包允许您设置虚假响应并验证发送的请求.请参阅该链接以获取大量用法示例.

  • 或者,您的模拟不必是Jest特定的.[fetch-mock](http://www.wheresrhys.co.uk/fetch-mock/)有一个非常好的API,比jest-fetch-mock更全面. (8认同)
  • fetch-mock和几乎所有其他用于模拟fetch的模块的问题在于它们需要太多的设置。他们应该取消“ matcher”并自动拦截所有提取调用。我不想在单元测试中重复我的Express设置,只是为了确保被测试的代码收到合法的Response对象。 (2认同)