Jest中beforeEach提前解析Promise:如何实现Jasmine式测试?
Jest中测试Promise解析前状态的解决方案
问题原因
Jest与Jasmine的测试执行逻辑存在差异:Jest会在beforeEach执行完成后,自动清空所有待处理的微任务队列(包括Promise的.then回调);而Jasmine不会做这个操作。这就导致你在beforeEach里创建的Promise.resolve().then(...)会在测试开始前就执行完毕,state提前变为resolved,使得第一个断言失败。
解决方案
方案1:手动控制Promise的resolve时机
在beforeEach中创建一个处于pending状态的Promise,将resolve函数保存下来,直到测试中主动触发resolve:
describe("sync beforeEach", () => { let resolvePromise; let promise; let state; beforeEach(() => { state = 'pending'; // 创建pending状态的Promise,暴露resolve函数 promise = new Promise(resolve => { resolvePromise = resolve; }).then(() => { state = 'resolved'; }); }); test('should run before resolve', async () => { expect(state).toEqual('pending'); // 手动触发Promise解析 resolvePromise(); await promise; expect(state).toEqual('resolved'); }); });
方案2:将状态修改逻辑放到宏任务中
利用Jest不会自动执行宏任务(如setTimeout)的特性,把状态更新放到宏任务队列里,确保测试开始前不会执行:
describe("sync beforeEach", () => { let promise; let state; beforeEach(() => { state = 'pending'; promise = new Promise(resolve => { setTimeout(() => { state = 'resolved'; resolve(); }, 0); }); }); test('should run before resolve', async () => { expect(state).toEqual('pending'); await promise; expect(state).toEqual('resolved'); }); });
这两种方案都能确保测试开始时state处于pending状态,符合你的测试预期。
内容的提问来源于stack exchange,提问作者Callebe
相关产品推荐
相关产品推荐

