当前位置: 首页 > 知识库问答 >
问题:

Jest单元测试-异步函数中异步函数的模拟值

公沈浪
2023-03-14

在我的React项目中,我正在单元测试一个调用另一个异步函数的异步函数。

//SomeComponent.js
getAllJobs = async () => {
    var allJobStatuses = new Array();
    for(var endpointForRegion in this.props.regionalEndpointsMap) {
        let jobStatusesForRegion = await getJobStatuses(endpoint);
        allJobStatuses = allJobStatuses.concat(jobStatusesForRegion);
....
    }
    return allJobStatuses;
}

getJobStatuses = async (endpoint) => {
   const response = await fetch(endpoint, {
   ......
   return await response.json();
}
//SomeComponentTest.js
describe('<SomeComponent />', () => {
    ....
    beforeEach(() => {
        props = {regionalEndpointsMap: {
             'region1': 'region1ep',
             'region2': 'region2ep'
        }};
        wrapper = shallow(<SomeComponent {...props} />);
    });
    it('should get jobs for all regions', async () => {
        var startTime = new Date();
        let mockdata = {[
            {
            jobId: 'id',
            }
        ]};

        jest.spyOn(wrapper.instance(), 'getJobStatuses').mockResolvedValue(data);
        let allJobs = wrapper.instance.getAllJobs();
        let expectedData = [
            {jobId:'id'},
            {jobId:'id'}
        ];
        expect(allJobs).toEqual(expectedData);
}

尽管每次测试时,结果都是一个空的promise{},而不是预期的数据。我在网上找到了很多模拟异步“getJobStatuses”函数结果的实现,但都没有成功(显示了我在这里使用的实现)。为了测试调用它的函数(getAllJobs),模拟该函数结果的正确方法是什么

共有1个答案

钦景胜
2023-03-14

因为getAllJobsasync它将返回一个promise。你是想在这里等待promise吗?

let allJobs = await wrapper.instance.getAllJobs();
 类似资料:
  • 我在一个函数中有这样的代码块: 它获取一些数据,然后对数据运行验证()。 但是,我对数据的验证实际上也是异步的,因为它是根据一个json模式来验证数据的,而json模式位于一个独立的json文件中,所以它必须首先读取该文件。 我使用了一个承诺来读取文件内容,然后进行验证: 如何编辑此问题中的顶部代码块以解释if语句()中的异步函数?

  • 我有一个异步函数,我想同时测试成功和失败。函数成功时返回一个字符串,失败时抛出。我在测试失败上失败得很惨。下面是我的代码: 我通过注释失败的代码并在注释中添加结果来禁用 正如你所看到的,什么都不起作用。我相信我的测试几乎是第一个失败测试的Promises示例和最后一个失败测试的Async/Await示例的完全副本,但是没有一个可以工作。 我相信与Jest文档中的示例的不同之处在于,它们展示了如何测

  • 粗略地说,异步函数 为使用 Promise 的代码提供了更好的语法。 38.1. 异步函数:基础知识 考虑以下异步函数: async function fetchJsonAsync(url) { try { const request = await fetch(url); // async const text = await request.text(); // as

  • 问题内容: 如何从异步函数返回值?我试图喜欢这个 它给了我, 问题答案: 您不能超出范围。为了获得预期的结果,您应该将其包装到异步IIFE中,即 样品。 有关更多信息 由于返回一个Promise,因此可以将其省略,如下所示: 然后像以前一样做

  • 问题内容: 我如何最好地处理以下情况? 我有一个构造函数,需要一些时间才能完成。 我看到了三个选项,每个选项似乎都与众不同。 一种 ,向构造函数添加回调。 第二 ,使用EventEmitter发出“已加载”事件。 或三 ,阻止构造函数。 但我以前从未见过任何完成的事情。 我还有什么其他选择? 问题答案: 鉴于有必要避免在Node中进行阻塞,事件或回调的使用并不奇怪(1)。 稍加修改为2,即可将其与

  • 简述 在某些情况下,React框架出于性能优化考虑,可能会将多次state更新合并成一次更新。正因为如此,setState实际上是一个异步的函数。 但是,有一些行为也会阻止React框架本身对于多次state更新的合并,从而让state的更新变得同步化。 比如: eventListeners, Ajax, setTimeout 等等。 详解 当setState() 函数执行的时候,函数会创建一个暂