node.js - 如何测试 API 端点是否存在可由多个代码路径触发的错误路径?

标签 node.js unit-testing express mocha.js sinon

假设一个函数中有多个路径会导致服务器错误 (500)。所以在单元测试中:

  1. 仅从任何单个路径触发错误就足够了吗?
  2. 断言时仅断言 500 错误代码就足够了,还是还需要断言预期错误?

我的意思(在代码中)?

it('should trigger server error', async function() {

  // arrange
  const res = { 
    status: this.sandbox.stub().returnsThis(),
    json: this.sandbox.stub(),
  }; 
  const req = {
    body: { name: 'foo', email: 'foo@bar.com', password: 'password' },
  };
  // switch on one possible trigger path that would lead to 500 error
  const expectedError = new Error('Server Error');
  this.sandbox.stub(User, 'createWithPassword').rejects(expectedError);

  // act
  await userApi.create(req, res);

  // assert
  // is this assertion enough ?
  expect(res.status).to.have.been.calledWith(500);
  // also should this go along with the above? 
  expect(res.json).to.have.been.calledWith(expectedError);
});

最佳答案

解耦错误处理和用户 Controller /业务逻辑。您的用户 Controller 不必担心处理错误。

编写单独的错误处理中间件来处理任何错误:

module.handleErrors = (error, req, res, next) => {
  // Handle error
  // ...

  res.status(500).json()
}

但是现在我们需要一种方法来捕获 Controller 中发生的任何错误。所以我们需要另一个中间件来捕获错误并将错误转发给上面的错误处理中间件:

module.catchErrors = controllerAction => (req, res, next) => controllerAction(req, res).catch(next)

现在我们可以从全局错误处理程序开始连接中间件:

const express = require('express)
const { handleErrors } = require('./error-middleware)
const { userRoutes } = require('./user-routes)

const app = express()

app.use('/users', userRoutes)
app.use(handleErrors)

// ..

接下来连接用户路由和 Controller 以捕获错误:

const express = require('express')
const userController = require('./user-controller')
const { catchErrors } = require('./error-middleware')

const router = express.Router()

// Passing the createWithPassword function to the catch error middleware.
router.post('/', catchErrors(userController.createWithPassword))

module.exports = router

现在一切都已解耦,您可以自由地单独测试每个部分以进行单元测试。集成测试是您测试许多场景的地方。所以:

  1. 通过我描述的上述设置,我们不需要测试每个场景,因为最终任何错误都会被错误处理中间件捕获。我们所关心的是当出现错误时能够得到正确的处理。
  2. 这取决于您的要求。如果您所做的只是抛出一个没有明确消息/原因的异常,那么检查 500 和类型就足够了。但是,如果您期望在特定操作期间发生特定错误,那么需要测试错误消息、异常、HTTP 状态等。

关于node.js - 如何测试 API 端点是否存在可由多个代码路径触发的错误路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49710679/

相关文章:

javascript - NodeJS : Cannot call method 'push' of undefined

mysql - 使用nodejs将excel表上传到MySQL时如何忽略第一行?

node.js - Node.js 应用程序中的类型错误

.net - 使用 TFS 2010 运行异步任务单元测试

javascript - res.send 和 res.render 调用

node.js - 获取或搜索 npm 中的可执行文件列表

java - JUnit:具有私有(private)字段的测试生成器

带有 DBUnit : initial fixture fails to set up 的 PHPUnit

javascript - socket.io 不记录控制台消息

css - 如何使用 node、express 和 ejs 包含 css 文件?