在mocha中,你可以使用完成回调来保持mocha运行测试,直到你调用done()来表示所有promises都已返回。在某些情况下,使用完成是有问题的。我被告知我可以返回一个基本上与使用完成相同效果的承诺。它会在期望结果成功或失败后解决(如果预期抛出测试将失败)。但是,当我开始将多个thes链接在一起并导致测试通过时,即使期望失败,这也会失败。
完成按预期工作的示例(测试失败):
test('resync returns true upon success', function(done){
Models.Asset.Load(this.testId).then(function(asset){
asset.refresh().then(function(results){
expect(results !== null, "returns null, should return true");
expect(results.result === true, "does not return true");
done();
});
});
});
返回promise而不是使用done的示例总是导致测试通过:
test('resync returns true upon success', function(){
return Models.Asset.Load(this.testId).then(function(asset){
asset.refresh().then(function(results){
expect(results !== null, "returns null, should return true");
expect(results.result === true, "does not return true");
});
});
});
我假设返回返回第一个promise的结果,它始终为true而不是返回链的最终结果,这应该是期望的失败。
这里的参考是我先前的问题,其中向我解释了这个方法:
How can I pass mochas done callback function to another helper function
答案 0 :(得分:1)
您的测试失败了,因为asset.refresh()
返回一个承诺,但是您正在返回它,并且您的测试用例的默认返回值为undefined
。
解决方案:
test('resync returns true upon success', function(){
return Models.Asset.Load(this.testId).then(function(asset){
return asset.refresh().then(function(results){ // Line CHANGED, return added.
expect(results !== null, "returns null, should return true");
expect(results.result === true, "does not return true");
});
});
});
替代:
test('resync returns true upon success', function(){
return Models.Asset.Load(this.testId).then(function(asset){
return asset.refresh();
}).then(function(results){
expect(results !== null, "returns null, should return true");
expect(results.result === true, "does not return true");
});;
});