我有一个类似的功能(简化了代码以使此代码更具可读性)
import Adapter from "adapter-package";
const adapter = new Adapter();
async powerOn(): Promise<MyClass> {
const myClass = new MyClass();
await adapter.powerOn();
return myClass;
}
如您所见,我在await
的通话中使用adapter.powerOn()
。现在,我正在使用Jest编写单元测试。
it("can power on the adapter", async () => {
const spy = jest.spyOn(Adapter.prototype, "powerOn");
const myClass = await MyClass.powerOn();
expect(myClass).toBeInstanceOf(MyClass);
expect(spy).toHaveBeenAwaitedFor();
^^^^^^^^^^^^^^^^^^^^
spy.mockRestore();
}, 10000);
我强调的测试不存在,但这是我要测试的。我可以知道是否已经等待调用的方法吗?
编辑:
詹金斯会指出我不清楚我在问什么。基本上,我想确保在解决函数时,adapter.powerOn()
返回的Promise也已解决。因为我已经遇到一个问题,我不小心删除了await
之前的adapter.powerOn()
。
async powerOn():承诺{ const myClass = new MyClass(); adapter.powerOn(); 返回myClass; }
所以当我用
调用函数时await powerOn();
该函数已解决,但它没有等待对adapter.powerOn()
的调用,因此我不得不花一些时间进行调试。因此,我想确保在adapter.powerOn()
完成时解决await powerOn()
。
答案 0 :(得分:1)
这样的事情怎么样?
it("can power on the adapter", async () => {
let hasResolved = false;
const spy = jest.spyOn(Adapter.prototype, "powerOn");
const myClass = await MyClass.powerOn();
expect(myClass).toBeInstanceOf(MyClass);
let hasResolved = false;
//if it has been awaited then this should complete
spy.returnValues[0].then(()=>{
hasResolved=true;
})
expect(hasResolved).to.be.true;
spy.mockRestore();
}, 10000)
答案 1 :(得分:0)
您可以使用setInmediate
等待所有未完成的承诺:
const flushPromises = () => new Promise(setImmediate);
it("can power on the adapter", async () => {
const spy = jest.spyOn(Adapter.prototype, "powerOn");
await expect(MyClass.powerOn()).resolves.toBeInstanceOf(MyClass);
await expect(flushPromises()).resolves.toBeTruthy();
}, 10000);
此测试首先检查powerOn
是否解析并返回MyClass
的实例,然后检查每个待处理的承诺是否已解决或拒绝。
答案 2 :(得分:0)
这是我找到的解决方案:
import { inspect } from "util";
it("waits for the adapter to have been powered on", async () => {
const spy = jest
.spyOn(Adapter.prototype, "powerOn")
.mockImplementation(() => new Promise<void>(res => setTimeout(res, 0)));
await Sblendid.powerOn();
const spyPromise = spy.mock.results[0].value;
expect(inspect(spyPromise)).toBe("Promise { undefined }");
}, 10000);
线
spy.mock.results[0].value
将使我得到模拟所返回的承诺。在承诺上使用util.inspect
expect(inspect(spyPromise)).toBe("Promise { undefined }");
会给我"Promise { undefined }"
兑现已兑现的承诺(即返回undefined
),如果未兑现,则会返回"Promise { <pending> }"
,这就是我测试已解决的方式(完成)await Sblendid.powerOn();
。