当我使用 jest 从模拟的 axios 调用返回一些响应时,未定义

2023-12-25

我正在尝试模拟 axios 调用并验证响应,但是当我记录模拟 axios 调用的响应时,我得到undefined。有人知道为什么吗?

users.js

import axios from 'axios';

export default class MyClass{
   constructor(config){
      this.config = config;
   }

   async getUsers(url, params, successHandler, errorHandler) {
      return axios.post(url, params)
             .then(resp => this.handleAPIResponse.call(this, resp, successHandler, errorHandler))
             .catch(error => errorHandler);
   }
}

用户.test.js

import MyClass from './mycode.js';
import axios from 'axios';

jest.mock('axios');

beforeEach(() => {
  myClass = new MyClass({ env: 'prod' });
});

afterEach(() => {
  jest.clearAllMocks();
});

const mockResponseData = jest.fn((success, payload) => {
  return {
    data: {
      result: {
        success,
        payload
      }
    }
  };
});

test('should return all the users', async () => {
   const successHandler = jest.fn();
   const errorHandler = jest.fn();
   const users = mockResponseData(true, ['John Doe', 'Charles']);

   axios.post.mockImplementationOnce(() => {
     return Promise.resolve(users);
   });

   const response = await myClass.getUsers('url', {}, successHandler, errorHandler);
   console.log(response);  // This logs undefined
   expect(successHandler).toHaveBeenCalledTimes(1);
});

另外,我只是想澄清一下,我有一个mocks我的 src 目录下有一个名为 axios.js 的文件,我在其中模拟了 axios 的 post 方法。它看起来像这样:

export default {
  post: jest.fn(() => Promise.resolve({ data: {} }))
};

这是没有的解决方案__mocks__文件夹。仅使用jest.mock().

users.js

import axios from 'axios';

export default class MyClass {
  constructor(config) {
    this.config = config;
  }

  async getUsers(url, params, successHandler, errorHandler) {
    return axios
      .post(url, params)
      .then((resp) => this.handleAPIResponse.call(this, resp, successHandler, errorHandler))
      .catch((error) => errorHandler);
  }

  async handleAPIResponse(resp, successHandler, errorHandler) {
    successHandler();
    return resp;
  }
}

users.test.js:

import MyClass from './users';
import axios from 'axios';

jest.mock('axios', () => {
  return {
    post: jest.fn(() => Promise.resolve({ data: {} })),
  };
});

describe('59416347', () => {
  let myClass;
  beforeEach(() => {
    myClass = new MyClass({ env: 'prod' });
  });

  afterEach(() => {
    jest.clearAllMocks();
  });

  const mockResponseData = jest.fn((success, payload) => {
    return {
      data: {
        result: {
          success,
          payload,
        },
      },
    };
  });

  test('should return all the users', async () => {
    const successHandler = jest.fn();
    const errorHandler = jest.fn();
    const users = mockResponseData(true, ['John Doe', 'Charles']);

    axios.post.mockImplementationOnce(() => {
      return Promise.resolve(users);
    });

    const response = await myClass.getUsers('url', {}, successHandler, errorHandler);
    console.log(response);
    expect(response.data.result).toEqual({ success: true, payload: ['John Doe', 'Charles'] });
    expect(successHandler).toHaveBeenCalledTimes(1);
  });
});

带有覆盖率报告的单元测试结果:

 PASS  src/stackoverflow/59416347/users.test.js (9.166s)
  59416347
    ✓ should return all the users (18ms)

  console.log src/stackoverflow/59416347/users.test.js:41
    { data: { result: { success: true, payload: [Array] } } }

----------|----------|----------|----------|----------|-------------------|
File      |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files |    90.91 |      100 |    83.33 |    90.91 |                   |
 users.js |    90.91 |      100 |    83.33 |    90.91 |                12 |
----------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        10.518s

源代码:https://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/59416347 https://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/59416347

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当我使用 jest 从模拟的 axios 调用返回一些响应时,未定义 的相关文章

随机推荐

  • CFFILE - 使用组件上传文件

    我有一个表单 我想提交给组件进行处理 CRUD 行为 问题是似乎将多部分 表单数据传递给组件会以某种方式丢失文件位置 当到达应该上传文件的组件部分时 我收到臭名昭著的表单字段不包含文件错误 我不是 100 确定为什么会发生这种情况 但如果我
  • 如何只推送到 Hg 中的一个分支?

    我有一个 Hg 存储库 其中有 3 个分支 但其中两个处于非活动状态 因为我已经将它们合并到我的默认分支中 hg heads显示 3 个头 每个分支一个 尽管汞分支显示其中 2 个分支为 非活动 当我尝试推送我的默认分支时 使用hg Pus
  • InvalidDefinitionException:无法构造“com.vehicle.datatransferobject.VehicleDTO”的实例

    在我在 Spring Boot 中构建的 REST 端点中 我试图传递我的vehicleDTO到我的控制器 但在它到达我的控制器之前 出现了错误 InvalidDefinitionException 无法构造实例com vehicle da
  • 为什么在这个智能合约上使用断言?

    contract Sharer function sendHalf address payable addr public payable returns uint balance require msg value 2 0 Even va
  • TextInputLayout 后缀/前缀[重复]

    这个问题在这里已经有答案了 我想为 TextInputLayout 添加后缀 一个例子取自材料 io https material io guidelines components text fields html text fields
  • RestController 的最佳实践是什么?

    代码约定表明控制器中没有逻辑 一切都应该在服务层处理 我的问题特别是关于返回 ResponseEntity 应该在RestController中处理还是在Service层中处理 我两种方法都尝试过 我认为 RestController 是返
  • 这个spring类BatchPreparedStatementSetter有什么用呢?

    谁能给我简单介绍一下他的春季班 org springframework jdbc core BatchPreparedStatementSetter JavaDoc API 链接 http static springsource org s
  • java 使用机器人类发送击键

    我知道可以使用 Robot Class 在 java 中发送击键 但是有没有办法在目标进程已经启动时指定目标进程 机器人会将击键发送到顶部的应用程序窗口 要将击键发送到特定目标 您需要首先将该目标设置为平台的前台窗口 执行此操作可能需要本机
  • Mongoose如何使用位置运算符从具有特定条件的双重嵌套数组中提取数据,并返回新结果

    假设我有以下架构 id ObjectId 1 title string answers id ObjectId 2 text string upVotes id ObjectId 3 userId ObjectId 4 我想要的是从答案赞成
  • 镜像 Azure DevOps (Azure Repos) 中的所有 GitHub 活动

    我有一个案例 我想将所有内容存储在 Azure DevOps 中 CI CD Scrum 测试 发布 但我仍然想将所有代码托管在 GitHub 上 如何在 Azure DevOps 中镜像 GitHub 中创建的所有分支 合并 提交 PR
  • 如何在结构体定义中初始化数组?

    如何在此结构中将数组值设置为 0 这显然是错误的 我该如何正确地做呢 struct Game board i32 3 3 0 0 0 0 0 0 0 0 0 在一个函数中 这将是 let board i32 3 3 0 0 0 0 0 0
  • 在 testng @AfterMethod 中检测测试失败

    如果测试失败我想截图 我不想用 try catch 块包装所有测试方法 而是想将此逻辑添加到用注释注释的方法中 AfterMethod 我怎样才能在注释的方法中检测到 AfterMethod如果当前测试失败 如果方法注释为 AfterMet
  • 如何在 Mozilla Firefox 中使用 javascript 创建文件

    我想用 javascript 编写一个函数 它创建一个文件并向其中写入一些内容 我正在使用 Firefox 任何人都可以在这种情况下帮助我 谢谢 您可以在 Firefox 中使用 JavaScript 编写文件 但必须使用 XPCOM 对象
  • 标记不使用 @react-google-maps/api 渲染

    我对反应世界相对较新 尤其是使用谷歌地图 我正在使用 react google maps api 和 React 版本 18 我试图显示多个位置 作为标记 但是 它们没有显示在初始渲染上 我遵循了文档 没有收到任何错误 只是未显示标记 有谁
  • SDK 更新后出现意外的顶级异常

    我正在开发一个 Android 项目 该项目的构建路径中有一个 Android 库项目 这两个项目的 libs 文件夹和构建路径中都有 AdWhirl SDK 库 现在 自从将 android sdk 工具更新到 r15 后 主项目的 an
  • 如何判断Rails Association是否是Eager Loaded?

    有谁知道如何确定 Rails 关联是否已预先加载 我的情况 我有一个结果集 其中有时会急切加载其中一个关联 有时则不会 如果它不是急切加载的 那么我想使用 ActiveRecord 的 find 来查找关联 如果它是急切加载的 我想使用检测
  • 是否可以以 HH:MM:SS 格式打印持续时间?

    t1 lt as POSIXct 2017 03 02 11 58 20 t2 lt as POSIXct 2017 03 02 12 00 05 print lubridate as duration lubridate interval
  • R 并行作业挂起

    我正在运行网站上写的 Snow test R 脚本 https hpcf umbc edu other packages how to run r programs on maya https hpcf umbc edu other pac
  • 如何使用 JavaScript 屏蔽 HTML 输入?

    如何在 HTML 控件上使用 javascript 屏蔽美国电话 我希望输入强制文本采用以下格式 111 111 1111 这是我目前拥有的 mask str textbox loc delim var locs loc split for
  • 当我使用 jest 从模拟的 axios 调用返回一些响应时,未定义

    我正在尝试模拟 axios 调用并验证响应 但是当我记录模拟 axios 调用的响应时 我得到undefined 有人知道为什么吗 users js import axios from axios export default class