gpt4 book ai didi

javascript - 如何使用 spyOn 测试 Promise.all 的功能

转载 作者:行者123 更新时间:2023-11-28 21:16:24 24 4
gpt4 key购买 nike

我是编码新手,所以请询问是否需要更多信息。

我想使用 spyOn 测试 Promise.all 中的 then-block,但该函数从未被调用。

public foo(): void {
const names = this.getNames();

Promise.all(
names.map(name =>
this.nameService.doSomething( //some params )
)
)
.then(result => this.controller.ok(names))
.catch(error => {
//do something
});
}

这是测试

it('should call controller.ok when name is set', () => {
spyOn(nameService, 'doSomething').and.returnValue(Promise.resolve());
spyOn(controller, 'ok');

service.foo();

expect(nameService.doSomething).toHaveBeenCalledWith({
//some params
});
expect(controller.ok).toHaveBeenCalled(); //fails because never called
});

我调试了代码,即使使用正确的参数也调用了 doSomething,代码也到达了 then-block。但是测试表明,它永远不会被调用,所以代码在某处中断了,我不知道为什么?

未调用 catch block 。

最佳答案

表示异步操作最终完成或失败的 promise 。在您的测试中,当检查是否 controller.ok 时已被调用,PromisePromise.all 返回方法foo还没有解决。因此,您需要某种同步。

一种可能的解决方案如下所示。

it('should call controller.ok when name is set', () => {
const promises: Promise<any>[] = [];
spyOn(nameService, 'doSomething').and.callFake(n => {
const promise = Promise.resolve();
promises.push(promise);
return promise;
});
spyOn(controller, 'ok');

service.foo();

Promise.all(promises)
.then(r => expect(controller.ok).toHaveBeenCalled());
});

同样可以通过使用 fakeAsync 来实现和 tick来自 @angular/core/testing .

it('should call controller.ok when name is set', fakeAsync(() => {
spyOn(nameService, 'doSomething').and.returnValue(Promise.resolve());
spyOn(controller, 'ok');

service.foo();
tick();

expect(controller.ok).toHaveBeenCalled();
}));

关于javascript - 如何使用 spyOn 测试 Promise.all 的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57409612/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com