【问题标题】:unit test a node.js controller that call external api单元测试调用外部 api 的 node.js 控制器
【发布时间】:2018-05-08 08:33:08
【问题描述】:

如何在调用外部 api 的模块/函数下面进行测试?如果我正在触发不再是单元测试的 api,那就是调用集成或流测试。我知道有这样的东西叫做 mock api,但它应该测试什么?我预计只有 2 个结果,失败或成功。由于外部 api 已经处理边缘情况(说没有提供名称参数),我是否必须在我这边进行单元测试?

const request = require('request')
import PATH from './config/somewhere'

export const createUser = async (req, res, next) => {
  try {
    response = await request.post(`${PATH}/api/user/create`, {form: {name: req.body.name}})
    res.json(response)
  } catch(err) {
    this.throw(err.message)
  }
}

【问题讨论】:

  • 如果您在此调用之后有额外的逻辑或在数据到达此处之前进行任何转换等,您应该通过模拟来测试该功能。否则,这将在集成或 e2e 等中涵盖,没有必要对这个 IMO 进行单元测试。
  • 你需要模拟 request 模块。

标签: javascript node.js unit-testing express


【解决方案1】:

见: https://github.com/node-nock/nock

您可以在初始化测试时调用以下代码:

const nock = require('nock');

// ...

nock(`${PATH}/api/user`)
    .post('/create')
    .reply(200, { data: 'foo' });

// ...
// All calls to request from here will be intercepted by nock

【讨论】:

  • 你能写更多吗?在这种情况下,你真的会进行真正的 http 调用吗?
  • 您的代码没有改变,您在运行任何 http 请求之前调用了 nock。你可以关注这篇博文:semaphoreci.com/community/tutorials/…
猜你喜欢
  • 2015-07-16
  • 1970-01-01
  • 2019-04-18
  • 2020-05-22
  • 2022-12-05
  • 1970-01-01
  • 1970-01-01
  • 2016-01-31
  • 1970-01-01
相关资源
最近更新 更多