如何“刷新”笑话模拟(不使用等待)

时间:2019-09-02 16:23:42

标签: javascript mocking jestjs

我来自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。我需要更精细的控制,并希望检查内部跟踪变量,以便可以缓慢地逐步执行应用程序的所有回调(而不会破坏函数的封装)。我需要进行基于状态的测试,重要的是我可以依次逐步完成每个阻塞调用。

请有人能帮助我弄清楚我如何控制诺言并逐步解决模拟问题吗?

1 个答案:

答案 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