我正在使用mocha和expect.js测试一个小节点模块,我有点头疼。
这是测试定义:
it('Should return an expansion array that contains all the objects that comes along within a single group', function (done) {
visibility.expand(data, config.data, companies, groups, function (error, expansion) {
expect(error).to.be(null);
expect(expansion).to.be.an('array');
expect(expansion).to.have.length(2);
expect(expansion.toString()).to.eql([testCompaniesIds[2], testCompaniesIds[3]].toString());
done();
});
});
我遇到的问题是,当Mocha到达这条线时
expect(expansion).to.have.length(2);
并且长度与2不同,而不是像以下那样抛出错误:预期为2但长度为1它会因为超时而停止并抛出错误。
我确认测试已执行到该行。
更多信息:我测试的方法接收公司名称数组和组名称数组。每个组都包含一组公司数据库ID。
该方法的预期行为是返回一个数组,其中相应的公司ID与属于该组对象的公司ID数组合并。
编辑2 由于可能重复:我错了。它的确在执行范围内执行。
编辑由于可能重复:未在promise范围内执行的期望(在使用promises并在resolve或reject函数中执行expect时是捕获错误的承诺)。< / p>
提前致谢!
答案 0 :(得分:1)
在这样的try-catch之间包装所有测试:
it('Should return an expansion array that contains all the objects that comes along within a single group', function (done) {
visibility.expand(data, config.data, [testCompanies[0].name, testCompanies[1].name], [testGroups[0].name, testGroups[1].name], function (error, expansion) {
try {
expect(error).to.be(null);
expect(expansion).to.be.an('array');
expect(expansion).to.have.length(2);
expect(checkIdIsContainedInArray(testCompaniesIds[0], expansion)).to.be(true);
expect(checkIdIsContainedInArray(testCompaniesIds[1], expansion)).to.be(true);
expect(checkIdIsContainedInArray(testCompaniesIds[2], expansion)).to.be(true);
expect(checkIdIsContainedInArray(testCompaniesIds[3], expansion)).to.be(true);
done();
} catch (e) {
done(e);
}
});
});
此测试因阵列长度而引发错误(为4且应为2):
Error: expected [ '464142414441464142414441',
'464142414441464142414442',
'464142414441464142414443',
'464142414441464142414444' ] to have a length of 2 but got 4
而不是:
Error: timeout of 2000ms exceeded
这可能意味着什么。
调试expect.js我看到它抛出了一个错误,但是Mocha没有设法捕获它。
虽然这个解决方案可能不如期望的那么优雅,但至少它提供了所需的反馈而不是超时。
答案 1 :(得分:1)
我相信这实际上是按预期工作的。
Mocha测试只能在实际调用done()时结束异步调用。由于错误被抛出mocha执行上下文的范围之外,它永远不会到达那段代码,并且执行基本上没有时间。
我似乎无法找到任何官方文件说明这一点,但这里有一些(有些相关的希望?)参考文献 -
https://github.com/pouchdb/pouchdb/issues/1339#issuecomment-34739526
http://chaijs.com/guide/styles/#expect //搜索回调错误处理
Is there a way to get Chai working with asynchronous Mocha tests?
Mocha failed assertion causing timeout
编辑 - 实际上,我看到我倒退了,它肯定会抓住异常。我会再次查看原始代码,看看你是否有正确的一切。也许更新expect.js并查看它当前版本是否存在某些问题(或提交故障单)。我使用了期望库的chai,并且能够很好地解决它。 http://chaijs.com/
错误被正确抛出的代码示例 -
var chai = require('chai')
, expect = chai.expect;
describe('something', function () {
var j = [1];
it('does something.. ', function (done) {
setInterval(function () {
console.log('its done');
expect(j).to.be.length(2);
done();
}, 1000);
});
});
//Uncaught AssertionError: expected [ 1 ] to have a length of 2 but got 1
答案 2 :(得分:1)
您正在执行回调函数中的期望。
这意味着代码正在visibility.expand方法中执行。
我很确定您所看到的行为是因为使用了promises ...您是否在visibility.expand方法中使用了promise?