You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 11:38:09