【发布时间】:2016-12-29 17:29:27
【问题描述】:
我们正在测试对返回 Promise<void> 的函数的调用。我们如何才能等到承诺解决并then 做一些测试?
then() 关闭函数的标准方法不起作用,因为 Promise<void> 是不可用的。因此,我们采用了以下方法,虽然可行,但似乎并不理想。
初步方法
it("it does something...", function (done) {
function wrappedPromise() {
functionThatReturnsPromiseVoid(someArg);
return new Promise((resolve) => resolve());
}
wrappedPromise()
.then(() => {
expect(someVar).toBe("someValue");
done();
});
});
后续方法
let wrapVoidPromise = (wrapped): Promise<any> => new Promise((resolve) => {
wrapped();
resolve();
});
it("it does something...", function (done) {
wrapVoidPromise(() => functionThatReturnsPromiseVoid(someArg))
.then(() => {
expect(someVar).toBe("someValue");
done();
});
});
我们如何在不需要包装不可链接的承诺的情况下做到这一点?
编辑
这是GitHub link to the actual test。它包括这个调用:
route.navigationStrategy(instruction) // returns Promise<void>
这是GitHub link to the function。该实现被隐藏在 aurelia-router 的源内部某处。这是它的界面:
navigationStrategy?: (instruction: NavigationInstruction) => Promise<void>|void;
【问题讨论】:
-
a Promise<void> is not thenable- 在那种情况下听起来不像一个标准的 Promise ... 可以使用的是 core functionality of a Promise - 没有then- 这是毫无意义的 - 这样一个还有什么其他目的答应吗? -
您可能误解了
Promise<void>的含义。它只是意味着承诺被解决,没有价值(或者价值undefined,如果你更喜欢这样想的话)。这是一个正常的、可链接的承诺。除非您使用的 Promise 库很奇怪且不符合 A+ 标准? -
这些 cmets 中的任何一个是否建议在承诺解决后运行测试而无需包装承诺?无论出于何种原因,@GregL 在
Promise<void>上执行then()都不起作用。 -
你使用的是什么承诺库?或者这是使用原生的
Promise?什么版本的茉莉花? -
@GregL 这是 TypeScript...我已经更新了标签。
标签: javascript typescript jasmine promise