【发布时间】:2017-01-02 08:52:26
【问题描述】:
我目前正在使用 mocha 2.5.3、supertest 2.0.0、knex 0.11.10、restify 4.1.1 和 sqlite3 3.1.4。
我有以下非常简单的 restify 服务器:
const restify = require('restify');
const knex = require('knex')({
client: 'sqlite3',
connection: {
'filename': 'test.db'
}
});
const app = restify.createServer();
app.get('/', (req, res, next) => {
knex.select().from('nonexistent_table')
.then((rows) => {
return res.json(rows);
})
.catch((err) => {
return res.send('error');
});
});
module.exports = app;
以下测试将导致测试在 2000 毫秒超时而不是失败:
const assert = require('assert');
const supertest = require('supertest');
const app = require('./app');
describe('GET /', function () {
it('should not timeout', function (done) {
supertest(app)
.get('/')
.end(function(err, res) {
assert(false);
done();
});
});
});
如果对 knex 的调用得到满足而不是被拒绝,则测试会正确失败并且不会超时。仅当拒绝 knex 调用时才会出现超时。
有没有人想过什么可能导致超时而不是正确的失败?
编辑:我已经尽可能地调试了这个,似乎超时发生在 mocha 尝试生成堆栈跟踪时。
【问题讨论】:
-
查看我的答案here:因为断言引发了错误,所以永远不会调用
done并且永远不会捕获错误。 -
@robertklep 谢谢,但我不确定这是正确的答案,原因有两个。首先,如果 knex 解析,则测试正常失败。由于我在测试中直接使用
assert(false),因此故障模式完全不应该取决于来自restify服务器的响应或来自knex的结果,但它确实如此!其次,如果我编写了一个不执行异步 http 调用的 mocha 测试并简单地抛出一个错误,那么即使我从未调用过done(),测试也会正确地失败并且不会超时。这让我相信抛出错误/失败断言是 mocha 测试失败的正常方式。
标签: node.js mocha.js restify supertest