【发布时间】:2018-04-02 04:07:34
【问题描述】:
如果有一段逻辑要通过各种顺序承诺进行单元测试,那么如何在then(() => {}) 函数中实际断言逻辑?通过与下面类似的设置,我遇到了第一个测试将通过但第二个测试没有通过的问题。我很好奇为什么实现中的匿名 then 块永远不会到达。
//Implementation
class FiddleService {
constructor(dependencies = {}) {
const { someService = new SomeService() } = dependencies;
this.someService = someService;
}
doSomething(params) {
this.someService.asyncOperation1(params).then((result) => {
...
//never gets called by spy in test
return this.someService.asyncOperation2(result.firstName);
}).then((result) => {
return this.someService.asyncOperation3(result.age);
});
}
}
//test
describe("FiddleService", () => {
let someService;
beforeAll(() => {
someService = new SomeService();
spyOn(someService.asyncOperation1).and
.returnValue(new Promise(() => {firstName: "Jan"});
spyOn(someService.asyncOperation2).and
.returnValue(new Promise(() => {age: 50});
spyOn(someService.asyncOperation3);
});
it("calls asyncOperation1", () => {
let fiddleService = new FiddleService();
fiddleService.doSomething({});
expect(someService.asyncOperation1).toHaveBeenCalled();
});
it("calls asyncOperation2", () => {
let fiddleService = new FiddleService();
fiddleService.doSomething({});
expect(someService.asyncOperation2).toHaveBeenCalled();
});
});
【问题讨论】:
-
这两个
new Promise(() => ...)表达式返回永远不会被解决的承诺。Promise.resolve(...),在两个地方,似乎更合适。
标签: node.js unit-testing promise jasmine