摘要
在进行 Node.js 后端开发时,单元测试是必不可少的。而使用 Chai.expect 在 Node.js 中测试 Express API 时,有时会出现错误。本文将会详细介绍这些错误的原因及如何解决。
错误场景
先看一段示例代码:
-- -------------------- ---- ------- ----- --- - ---------- ------------ ----- ---- -- - --------------- --------- --- ----------- ----- -- -- - ---------- ------ ----- -------- ---- -- - ---- ------------- --------- ---------- ---- -- - -------------------------------- --------- ------- --- --- ---
这个测试用例看起来并没有什么问题,但是在执行时会报错:
TypeError: app.address is not a function
这是因为在 Node.js 中,应用程序(app)没有 address
函数。而在上述测试用例中,我们使用了 chai.request(app)
这个语句来创建 request 对象。这个语句的执行会调用 app.listen()
,因此在测试用例中 app
已经被修改为一个 server 对象。在后续的测试中,chai.request(app)
中的 app
就是这个 server 对象,而不是我们原本的应用程序对象。
另一个错误的场景是,当我们使用 chai-http
发送请求时,有时候会出现“请求超时”的错误:
Error: timeout of 2000ms exceeded. Ensure the done() callback is being called in this test.
这个错误的原因是请求超时了。在这种情况下,需要调整请求超时时间。
解决方法
解决第一个错误非常简单。我们只需要新建一个 app 实例,然后在测试用例中使用它就可以了。修改后的代码如下:
-- -------------------- ---- ------- ----------- ----- -- -- - ----- --- - ---------- --------- -- - ------------ ----- ---- -- - --------------- --------- --- --- ---------- ------ ----- -------- ---- -- - ---- ------------- --------- ---------- ---- -- - -------------------------------- --------- ------- --- --- ---
我们在测试用例之前新建了一个 app 实例,并在 before()
钩子中定义路由。这样,我们就可以在测试用例中使用这个 app 实例,而不会改变原有的 app 对象了。
解决第二个错误也比较简单。我们可以手动调整超时时间。修改后的代码如下:
-- -------------------- ---- ------- ----------- ----- -- -- - ---------- ------ ----- -------- ---- -- - ---- ------------- --------- -------------- -- ------ ---- -- ---------- ---- -- - -------------------------------- --------- ------- --- --- ---
我们在 chai.request(app)
方法链中添加了 .timeout(3000)
来手动设置超时时间。需要注意的是,如果实际请求的时间超过了这个时间,仍然会出现超时错误。
总结
本文介绍了使用 Chai.expect 在 Node.js 中测试 Express API 出现的两种错误,以及如何解决这些错误。通过本文的指导,你可以更加愉快地进行单元测试了。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6469d2a6968c7c53b09a1af0