当chai.expect
断言失败时,它们通常会导致测试失败,并且否定结果会被添加到测试运行器的报告中(在这种情况下mocha
)。
但是,当我使用使用 包装的生成器函数时co.wrap()
,如下所示,会发生一些奇怪的事情:当断言通过时,一切都运行得很好。但是,当断言失败时,测试会超时。
如何与+co
一起使用?mocha
chai
it('calls API and then verifies database contents', function(done) {
var input = {
id: 'foo',
number: 123,
};
request
.post('/foo')
.send(input)
.expect(201)
.expect({
id: input.id,
number: input.number,
})
.end(function(err) {
if (!!err) {
return done(err);
}
// Now check that database contents are correct
co.wrap(function *() {
var dbFoo = yield foos.findOne({
id: input.id,
});
continueTest(dbFoo);
})();
function continueTest(dbFoo) {
//NOTE when these assertions fail, test times out
expect(dbFoo).to.have.property('id').to.equal(input.id);
expect(dbFoo).to.have.property('number').to.equal(input.number);
done();
}
});
});
解决方案:
正如下面@Bergi 所指出的,问题是由于co.wrap()
吞下 引发的异常而出现的expect()
,不允许它冒泡到需要找到它的位置。mocha
解决方案是使用co()
而不是co.wrap()
,并添加.catch()
并传递done
回调,如下所示。
// Now check that database contents are correct
co(function *() {
var dbFoo = yield foos.findOne({
id: input.id,
});
continueTest(dbFoo);
}).catch(done);