簡體   English   中英

用玩笑測試 promise 拒絕代碼路徑

[英]Testing a promise reject code path with jest

我有一種情況,當 promise 拒絕時,我正在嘗試測試代碼路徑。 設置相對復雜,但我已將其簡化為最小可重現示例:

let resolver;
let rejecter;

const p = new Promise((resolve, reject) => {
    resolver = resolve;
    rejecter = reject;
});

const f = jest.fn((x) => {
    console.log(x);
});

const run = () => {
    return p
        .then(() => {
            f("resolved");
        })
        .catch(() => {
            f("rejected");
        });
};

beforeEach(() => {
    f.mockClear();
});

// this test passes
test("it should call with resolved when p resolves", async () => {
    run();
    resolver();
    await p;

    expect(f).toHaveBeenCalledWith("resolved");
});

// this test fails
test("it should call with rejected when p rejects", async () => {
    run();
    rejecter();
    await p;

    expect(f).toHaveBeenCalledWith("rejected");
});

我的問題是,盡管f確實被稱為"rejected" ,但測試失敗了,原因是

thrown: undefined

我在這一點上的猜測是,這與 promise 拒絕的事實有關。 我曾希望這不會是一個問題,因為它被抓住了。 我怎樣才能成功完成這個測試?

我通過在 promise p上添加一個catch來解決這個問題:

// this test fails
test("it should call with rejected when p rejects", async () => {
    run();
    rejecter();
    await p.catch(() => {});

    expect(f).toHaveBeenCalledWith("rejected");
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM