繁体   English   中英

使用Mocha和Supertest测试Express错误

[英]Testing Express errors with Mocha and Supertest

例如,我必须在验收测试中测试服务器错误(Express),这些错误不能(或不应该)与响应一起发送

错误:发送后无法设置标头。

使用错误处理程序捕获错误并使用5XX代码进行响应将在此处提供有价值的反馈,但问题是已经发送了标头。

这种错误可能是非关键的,很难发现,通常它们是从日志中找出来的。

规格是

it('should send 200', function (done) {
    request(app).get('/').expect(200, done);
});

测试的应用程序是

app.get('/', function (req, res, next) {
    res.sendStatus(200);
    next();
});

app.use(function (req, res) {
    res.sendStatus(200);
});

在类似情况下,在Express app实例和请求测试库(即Supertest)之间进行通信的最合适方式是什么?

问题不仅限于Supertest。 如果有包可以解决Supertest无法解决的问题,也可以考虑它们。

尝试只设置状态代码而不发送它,并避免发送两次抛出错误使用res.status()

正如快递文件所述

设置响应的HTTP状态。 它是Node的response.statusCode可链接别名。

恕我直言,如果要检测它在一个终端到端到端 (E2E)测试工具,如supertest (或 ),你必须处理快递错误并发送正确的输出(500状态错误,一些消息...),以允许检测它。

或者使用单元测试来测试控制器函数不会使用chai或本机断言抛出任何错误。

在这里回答了类似的问题。 “无法在设置后设置标头”错误应该通过表示为未处理的异常来引发。 因此,您应该能够通过进程引发的unhandledException事件来访问它。

然而,由于时间安排,这更加棘手。 您的测试用例期望函数和完成函数将排在第一个res.statusCode调用之后的tick上的事件循环上进行处理。 不幸的是,res.statusCode的下一次调用可能会在不确定的时间后发生。 例如,如果第二个路由处理程序调用一个非常慢的Web服务或db然后调用res.statusCode,该怎么办?

考虑到这一点,你的选择非常困难。 蛮力的方法是在测试代码中等待一段确定的时间,然后检查。 它有效但缓慢且不确定,这将导致您的测试不稳定。

另一种选择是检查您在Express中可能具有的任何检测代码。 如果您使用express中的代码来保存各种路由处理程序的进程调用数量指标,则可以将这些指标公开给测试代码。 然后,您完成测试的一个条件是进程中路由调用的所有指标都是0.第二个选项将允许您编写确定性测试并且速度更快,因为您可以轮询指标。

最后的选择是通过单元测试来处理这个测试用例。 这可能是最好的解决方案,因为它是确定性的,不需要任何类型的轮询。 但是,缺点是您需要知道两个函数都按顺序调用,这会导致您尝试在测试代码中重新创建用于调用路由处理程序的逻辑。

我使用HAPI而不是Express来做到这一点,但我解决了同样的问题。 我使用外部库来进行调用(如请求 - 承诺)并且它有效。 捕获请求 - 承诺响应中的错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM