【问题标题】:Mocking functions called inside then() with jest用笑话在 then() 内部调用的模拟函数
【发布时间】:2020-06-24 12:34:17
【问题描述】:

我正在尝试测试这个功能

const handleSave = () => {
    const cveIds = cveList.map(item => item.id);
    return setCveStatus({
        status_id: parseInt(statusId),
        cve: cveIds,
        status_text: justification
    })
    .then(() => !checkboxState && setSystemCveStatus({ cve: cveIds }))
    .then(updateRef);
};

调用我正在模拟的 2 个函数 setCveStatussetSystemCveStatus

const setCveStatusMock = jest.fn(parameters => new Promise(resolve => resolve(parameters)));
const setSystemCveStatusMock = jest.fn(parameters => new Promise(resolve => resolve(parameters)));

deps.setCveStatus = setCveStatusMock;
deps.setSystemCveStatus = setSystemCveStatusMock;

并测试它们的名称

expect(setCveStatusMock).toBeCalledWith({
    status_id: 3,
    status_text: 'new',
    cve: ['CVE-2020-0001']
});

expect(setSystemCveStatusMock).toBeCalledWith({
    cve: ['CVE-2020-0001']
});

但是第二个期望失败了,即使它不应该有。 如何模拟和测试 .then() 内部调用的函数?

【问题讨论】:

  • 你能说明你在测试中是如何调用handleSave()的吗?

标签: javascript reactjs asynchronous testing jestjs


【解决方案1】:

优雅地解决这个问题的一种方法是使用asyncFn

用那个代替:

const setCveStatusMock = jest.fn(parameters => new Promise(resolve => resolve(parameters)));

// ...

expect(setSystemCveStatusMock).toBeCalledWith({
    cve: ['CVE-2020-0001']
});

你可以

import asyncFn from '@asyncFn/jest';
const setCveStatusMock = asyncFn();

// ...

// Resolve the call for setCveStatusMock and await for anything that happens as a result of that.
await setCveStatusMock.resolve();

// ...

expect(setSystemCveStatusMock).toBeCalledWith({
    cve: ['CVE-2020-0001']
});

免责声明:我是作者之一。

【讨论】:

    猜你喜欢
    • 2019-08-06
    • 2019-07-15
    • 2018-10-08
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-03
    • 1970-01-01
    相关资源
    最近更新 更多