gpt4 book ai didi

javascript - 如何解析模拟函数中的 Promise?

转载 作者:太空宇宙 更新时间:2023-11-03 23:49:42 25 4
gpt4 key购买 nike

我正在尝试测试返回 Promise 并在我想模拟的另一个方法中解析的方法。我可以在不模拟的情况下测试它,但我不想这样做,因为凭据在另一台机器上不起作用。

这是我的服务代码 (PollyService.ts):

@Service()
export class PollyService {
@Inject()
private polly: Polly; // aws-sdk Polly
url: string;

getSpeech(body: any) {
return new Promise((resolve) => {
let voice: string = (voices as any)[body.code];

let params = {
exampleParam: example
};

this.polly.synthesizeSpeech(params, (error: any, data: any) => {
if (error) throw error;
else {
resolve(data);
}
});
});
}
}

这是测试 (app.spec.ts)

describe('PollyService', () => {
afterEach(() => {
Container.reset();
});
it ('Should return data', async () => {
const event: any = {
body: {
sentence: "potato",
code: "en"
}
};
let polly = Container.get(Polly); // aws-sdk polly
spyOn(polly, 'synthesizeSpeech'); // and here I want to resolve Promise

await Container.get(PollyService).getSpeech(event.body);
});
});

当我 mock 没有解决 promise 时会出现错误:

错误:超时 - 异步函数未在 5000 毫秒内完成(由 jasmine.DEFAULT_TIMEOUT_INTERVAL 设置)

如何在测试中模拟解决 Promise?

最佳答案

如果你想创建一个已经解决的 Promise,你可以简单地使用 Promise.resolve(someData)

在你的情况下应该是这样的:

spyOn(polly, 'synthesizeSpeech').and.returnValue(Promise.resolve('mockedData'));

注意:您收到超时错误消息是因为您既没有在函数末尾返回 promise ,也没有使用完成回调。

要么:

    ...
return await Container.get(PollyService).getSpeech(event.body);

describe('PollyService', () => {
afterEach(() => {
Container.reset();
});
it ('Should return data', async (done) => { // <- done is the callback
const event: any = {
body: {
sentence: "potato",
code: "en"
}
};
let polly = Container.get(Polly);
spyOn(polly, 'synthesizeSpeech');

await Container.get(PollyService).getSpeech(event.body);
done(); // <- calling it will tell jasmine your test is over
});
});

通常您选择返回 promise 或使用回调。我不确定 Jasmine 如何在同一方法中混合异步方法和回调,但它应该可以工作。更多信息here

关于javascript - 如何解析模拟函数中的 Promise?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59893674/

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