我来自AngularJS世界,但现在使用React和Jest(与Jest Mock一起使用)。
我想这样做。...
test('should update internal tracking variable', async () => {
api.post = jest.fn().mock;
expect(obj.postCallFinished).toBe(false)
obj.begin() //this calls api.post internally with await
expect(obj.postCallFinished).toBe(false)
api.post.flush()
expect(obj.postCallFinished).toBe(true)
})
在obj.begin
调用中,我不想在此实例中使用await。我需要更精细的控制,并希望检查内部跟踪变量,以便可以缓慢地逐步执行应用程序的所有回调(而不会破坏函数的封装)。我需要进行基于状态的测试,重要的是我可以依次逐步完成每个阻塞调用。
请有人能帮助我弄清楚我如何控制诺言并逐步解决模拟问题吗?
答案 0 :(得分:0)
听起来begin
是一个async
函数,它在一系列await
函数上调用async
。
您可以监视begin
中调用的函数,并使用mockfn.mock.results
检索每个返回的Promise
。然后,您可以在测试中分别await
Promises
中的每一个class MyClass {
constructor() {
this.state = 0;
}
async first() {
await Promise.resolve(); // <= do something asynchronous
this.state = 1;
}
async second() {
await Promise.resolve(); // <= do something asynchronous
this.state = 2;
}
async begin() {
await this.first();
await this.second();
await Promise.resolve(); // <= do something asynchronous
this.state = 3;
}
}
test('walk through begin', async () => {
const firstSpy = jest.spyOn(MyClass.prototype, 'first');
const secondSpy = jest.spyOn(MyClass.prototype, 'second');
const instance = new MyClass();
const promise = instance.begin();
expect(instance.state).toBe(0); // Success!
await firstSpy.mock.results[0].value; // <= wait for the Promise returned by first
expect(instance.state).toBe(1); // Success!
await secondSpy.mock.results[0].value; // <= wait for the Promise returned by second
expect(instance.state).toBe(2); // Success!
await promise; // <= wait for the Promise returned by begin
expect(instance.state).toBe(3); // Success!
})
,以检查每个步骤的状态。
这是一个入门的简单示例:
recordtable