【发布时间】:2018-09-18 00:20:29
【问题描述】:
我有一个看起来像这样的方法:
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 中的函数被调用时,即 doSomething 承诺有在我做我的断言时已经解决了。
那么解决这个问题的“最佳”方法是什么?
【问题讨论】:
-
是的,关于每个异步执行的函数都应该返回一个承诺。而不是(仅仅)因为 promise 中的结果值,而恰恰是因为你可以等待它。
-
如果你的
doSomethingElse函数是如此高级以至于它被不需要等待它的东西调用,因此没有将承诺传递给它的调用者,它应该有一个.catch()链末尾的处理程序。
标签: javascript testing promise