【问题标题】:Use Jest to test an API endpoint and its response使用 Jest 测试 API 端点及其响应
【发布时间】:2019-10-09 16:48:30
【问题描述】:

我想用 jest 来测试一个 API 端点,以检查它是否返回响应以及 JSON 是否包含我需要的参数键。

我的函数如下所示:

export function getFiveDayWeatherByCoordinates(id) {
  let url = FORECAST_ID_URL(id);

  return fetch(url)
    .then(response => response.json())
    .then(data => {
      return data;
    })
    .catch(err => console.log(err));

}

它返回一个带有一组参数的 JSON,我将只发布一个快照:

{
cnt: 14,
cod: "200",
city: {
  coord: {lat: 38.7169, lon: -9.1333},
  country: "PT",
  id: 8012502,
  name: "Socorro",
  population: 0,
  timezone: 3600,
}

到目前为止,我看到的每个教程都说要模拟响应,但我想测试实际的 API。

【问题讨论】:

  • 你想在服务器端测试 api 吗?是快递吗?
  • 我要测试 openweathermap API,它不是我的
  • 那么您要测试什么以及为什么要测试?你也不能测试响应,你可以验证。
  • 是的,我想验证响应。我想测试 API 响应,看看它是否不会破坏我的应用程序。因为任何响应更改都会破坏应用程序。
  • 你可以使用 Jest 来测试你的 react 应用。

标签: javascript json jestjs fetch


【解决方案1】:

我建议使用Frisby.js 来测试 API 响应。这是一个在 Jest 中运行的用于 API 测试的出色测试框架。我已经多次使用它来编写 API 和后端集成测试。不过,我通常将这些测试套件与我的 UI 单元测试分开。

这是一个例子:

it('should return weather coords', async () => {
  return frisby
    .get(`${global.apiUrl}/my-weather-endpoint`)
    .expect('status', 200)
    .expect('jsonTypes', Joi.object({
      cnt: Joi.number().required(),
      cod: Joi.string().required(),
      city: Joi.object({
        coord: Joi.object({ 
          lat: Joi.number().required(),
          lon: Joi.number().required()
        }),
        country: Joi.string().required(),
        id: Joi.number().required(),
        name: Joi.string().required(),
        population: Joi.number().required(),
        timezone: Joi.number().required()
    }).required()
  });
});

Frisby 还鼓励使用 Joi 验证框架(它已包含在 npm 包中)。

【讨论】:

  • 感谢您的建议,将看看 Frisby.js,它看起来可以满足我的需求
  • 你不能为你的应用不包含的东西编写单元测试。
  • @AZ_ - 这不是单元测试。它更像是一个集成测试。你当然可以编写一个测试来断言 API 的响应,即使 API 不是你的。
  • 很高兴@DiogoPeres 成功了。祝你的项目好运。
猜你喜欢
  • 2017-12-26
  • 2019-05-23
  • 2020-06-04
  • 2020-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-18
相关资源
最近更新 更多