我有一个看起来像这样的方法:
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}}的诺言在我做我的断言时就已经解决了。
那么解决这个问题的“最佳”方法是什么?
答案 0 :(得分:0)
您应该使用doSomething的模拟与doSomethingElse分别测试doSomething和doSomethingElse,并使用模拟后的方法来返回您的测试值。您基本上希望不同时测试它们。在这种情况下,您基本上是将doSomething和doSomethingElse耦合在一起,这使得测试更加困难。测试应该很容易,您不需要测试就可以查看诺言是否有效,因此请使用伪造的测试继续进行测试逻辑!
我自己没有发现缺少返回值的问题,有一个返回值,您只是将其链接起来,而不是存储它。