调用promise而不返回任何内容的函数是否应该视为错误?

时间:2018-09-17 16:08:48

标签: javascript testing promise

我有一个看起来像这样的方法:

doSomething(){
     return somethingPromisy().then((blerp) => {
         // do something with blerp
         return blerp;  // Modified, of course
     });
};

然后我有另一个看起来像这样的方法:

doSomethingElse(){
    stepOne();
    var x = stepTwo();
    var y = stepThree(x);
    doSomething.then((data) => {
        stepFour(data + y);
    });
};

我正在使用mocha + chai + sinon来测试此代码,尤其是doSomethingElse,然后我想作一些断言-但是我如何保证在我之前兑现诺言断言?我知道一种选择是将其更改为:

doSomethingElse(){
    /* ... */
    return doSomething.then(...);
};

如果我这样做,那么编写测试很容易,因为它是:

return doSomethingElse().then(() => {
    someFake.lastCall.args.should.deep.equal(expectedData);
});

在我的测试中,一切都很好。但是我是否应该仅仅为了兑现承诺就返还承诺?我实际上并不关心doSomethingElse的任何返回值-我只关心在测试doSomething.then中的函数被调用时,即{ {1}}的诺言在我做我的断言时就已经解决了。

那么解决这个问题的“最佳”方法是什么?

1 个答案:

答案 0 :(得分:0)

您应该使用doSomething的模拟与doSomethingElse分别测试doSomething和doSomethingElse,并使用模拟后的方法来返回您的测试值。您基本上希望不同时测试它们。在这种情况下,您基本上是将doSomething和doSomethingElse耦合在一起,这使得测试更加困难。测试应该很容易,您不需要测试就可以查看诺言是否有效,因此请使用伪造的测试继续进行测试逻辑!

我自己没有发现缺少返回值的问题,有一个返回值,您只是将其链接起来,而不是存储它。