如何在不使用 done 回调的情况下在 mocha 中链接多个 thens
How can I chain multiple thens in mocha without using a done callback
在 mocha 中,您可以使用 done 回调来阻止 mocha 进行 运行 测试,直到您调用 done() 以表明所有承诺都已 returned。在某些情况下,使用 done 是有问题的。有人告诉我,我可以 return 一个 promise,它基本上与使用 done 具有相同的效果。它将在预期结果成功或失败后解决(如果预期抛出测试将失败)。然而,当我开始将多个 thens 链接在一起并导致测试通过时,即使期望失败,这也会失败。
按预期工作的完成示例(测试失败):
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();
});
});
});
示例return使用 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");
});
});
});
我假设 return 是 return 第一个 promise 的结果,它永远是真实的,而不是 return 链的最终结果,它应该是期待失败。
这里参考我之前的问题,其中向我解释了这个方法:
你的测试失败了,因为,asset.refresh()
return 是一个承诺,但你正在 return 并且默认 return 是 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");
});;
});
在 mocha 中,您可以使用 done 回调来阻止 mocha 进行 运行 测试,直到您调用 done() 以表明所有承诺都已 returned。在某些情况下,使用 done 是有问题的。有人告诉我,我可以 return 一个 promise,它基本上与使用 done 具有相同的效果。它将在预期结果成功或失败后解决(如果预期抛出测试将失败)。然而,当我开始将多个 thens 链接在一起并导致测试通过时,即使期望失败,这也会失败。
按预期工作的完成示例(测试失败):
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();
});
});
});
示例return使用 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");
});
});
});
我假设 return 是 return 第一个 promise 的结果,它永远是真实的,而不是 return 链的最终结果,它应该是期待失败。
这里参考我之前的问题,其中向我解释了这个方法:
你的测试失败了,因为,asset.refresh()
return 是一个承诺,但你正在 return 并且默认 return 是 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");
});;
});