用Mocha和SupertesttestingExpress错误

例如,我必须在验收testing中testing服务器错误(Express),例如,验收testing不能(或不应该)发送响应

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

捕获error handling程序的错误和5XX代码响应将提供有价值的反馈在这里,但问题是头已经发送。

这类错误可能并不严重,难以发现,通常可以从日志中找出。

规范是

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

和testing的应用程序是

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

快速app实例和请求testing库(即Supertest)在类似情况下进行通信的最适合的方式是什么?

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

我在这里回答了类似的问题。 “无法设置标题后,他们已被设置”的错误应该提出作为一个未处理的例外表示。 所以,你应该能够通过进程引发的unhandledException事件来访问它。

然而,由于时机的缘故,这更为棘手。 您的testing用例的expect函数和done函数将在第一个res.statusCode调用之后的tick right上的事件循环中排队等待处理。 不幸的是,接下来的res.statusCode调用可能会在不确定的时间发生。 例如,如果第二个路由处理程序调用一个非常慢的webservice或db,然后调用res.statusCode,会发生什么呢?

考虑到这一点,你的select是相当困难的。 蛮力的方法是在testing代码中等待一段确定的时间,然后检查。 这是有效的,但缓慢和不确定性,这将导致你的testing片状。

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

最后的select是通过unit testing来处理这个testing用例。 这可能是最好的解决scheme,因为它是确定性的,不需要任何投票。 然而,缺点是你需要知道你的两个函数是按顺序调用的,这就导致你试图在你的testing代码中重新创build用来调用路由处理程序的逻辑。

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

正如快递文件所说的那样

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

恕我直言,如果你想在像supertest (或selenium )端到端(E2E)testing工具检测到它,你必须处理明确的错误,并发送一个正确的输出(500状态错误,一些消息…)检测到它。

或者使用一个unit testing来testing控制器函数不会使用chai或本地断言抛出任何错误。

我用HAPI而不是Express来做,但是我解决了同样的问题。 我使用外部库进行呼叫(如请求承诺),它的工作。 捕捉请求承诺响应中的错误。