如何在不使用 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");    
        });;
    });