【问题标题】:How to write api request tests without launching server?如何在不启动服务器的情况下编写 api 请求测试?
【发布时间】:2021-06-15 08:34:31
【问题描述】:

可以在端口上启动服务器并使用库“supertest”对其进行测试。 我想知道是否可以在不运行服务器的情况下做同样的事情?

Express 应用程序,与 fastify 应用程序或其他应用程序相同,在后台从本地节点获取请求和响应参数,如下所示:

const server = http.createServer((req, res) => {
  res.end('hello\n');
});

所以应该可以直接从测试中调用该回调。 如何获得该回调?是否有任何工具包可以帮助构建回调的请求和响应对象?

原因 - 只是为了让测试更快。由于我不想测试 HTTP 协议和节点内部,我想跳过它来节省时间。

【问题讨论】:

  • 当然,你只需要创建具有所有正确状态和方法的模拟(但功能)reqres 对象,然后将它们很好地挂钩以查看结果。
  • 你可以这样做。但是您需要区分单元测试和 API 测试。你应该两者都做,如果你在做单元测试,你应该一个一个地测试中间件,并根据需要最低限度地模拟 req、res 对象。如果你在做 API 测试,那么可以使用supertestnewman。在测试代​​码的某处,无论如何您都需要激活您的服务器。所以你应该知道是否有任何外部 API 调用,如果有,你可以让它进行调用并等待,或者只是模拟结果。
  • @Darkripper 你怎么知道我无法区分单元测试和 API 测试(可能称为集成或 e2e)?应该两者都做 - 我不这么认为,如果所有代码都包含集成或 e2e 测试 - 不需要单元。
  • @user2541867 您也可以将 API 测试称为集成或 e2e(取决于您的应用程序)。最好同时进行单元测试和集成测试。单元测试确实会迫使您以易于测试的块编写您的代码,并且从长远来看更易于维护。仅进行集成测试可能不会检查代码中的所有unit,但它仍然有效。最后,这只是偏好。你可以在这里阅读更多内容martinfowler.com/articles/practical-test-pyramid.html
  • 决定如何测试你的代码是关于花时间测试的利弊之间的平衡。所以是的,你的观点绝对正确

标签: node.js api express testing fastify


【解决方案1】:

Fastify 有this feature out of the box:

'use strict'

const { test } = require('tap')
const Fastify = require('fastify')

test('requests the "/" route', async t => {
  const fastify = Fastify()

  fastify.get('/', function (request, reply) {
    reply.send({ hello: 'world' })
  })

  const response = await app.inject({
    method: 'GET',
    url: '/'
  })
  t.strictEqual(response.statusCode, 200, 'returns a status code of 200')
})

在底层使用 light-my-request 来处理 req/resp 对象

【讨论】:

  • 太棒了,谢谢!我实际上使用的是 fastify,我询问了 express,因为它们非常相似
  • 觉得自己很愚蠢,因为在检查文档之前发布了一个问题...
  • 相信我,这不仅仅是正常的 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
  • 2019-09-21
  • 2020-07-18
  • 2020-04-29
  • 1970-01-01
相关资源
最近更新 更多