如何在不使用完成回调的情况下在mocha中链接多个域

时间:2015-05-21 01:27:54

标签: javascript promise mocha

在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

1 个答案:

答案 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");    
        });;
    });