简体   繁体   English

在 then() 内部调用的模拟函数开玩笑

[英]Mocking functions called inside then() with jest

I am trying to test this function我正在尝试测试此功能

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);
};

which calls 2 functions setCveStatus and setSystemCveStatus which I am mocking它调用了我正在嘲笑的 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;

and testing what are they called with并测试他们叫什么

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

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

But the second expect fails, even though it shouldn't have.但是第二个期望失败了,即使它不应该失败。 How can I mock and test functions called inside .then()?如何模拟和测试在 .then() 中调用的函数?

One way to solve this elegantly is with asyncFn .优雅地解决这个问题的一种方法是使用asyncFn

With that instead of:用那个代替:

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

// ...

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

you can你可以

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']
});

Disclaimer: I am one of the authors.免责声明:我是作者之一。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM