使用 Jest 进行 JavaScript REST GET 请求的单元测试

使用 jest 进行 javascript rest get 请求的单元测试

本文档旨在指导开发者如何使用 Jest 框架为 JavaScript 中的 REST GET 请求编写单元测试。我们将通过示例代码,详细介绍如何模拟 HTTP 请求、验证响应状态码和数据,以及处理错误情况,帮助你构建健壮可靠的测试用例,确保代码质量。

使用 Jest 测试 JavaScript REST GET 请求

在 JavaScript 开发中,经常需要与 REST API 进行交互。为了确保代码的正确性和可靠性,编写单元测试至关重要。本文将介绍如何使用 Jest 框架为 REST GET 请求编写测试用例。

前提条件

已安装 Node.js 和 npm。已安装 Jest:npm install –save-dev jest

待测试的 GET 请求函数

假设我们有如下的 GET 请求函数,该函数使用 https 模块发起请求,并根据响应状态码调用不同的回调函数:

const https = require('https');module.exports.get = function(req, url, callback, errorCallback) {  https.get(getOptions(req, url), (response) => {    handleResponse(response, callback, errorCallback);  }).on('error', (e) => {    console.error('MYAPP-GET Request.', e);    if (errorCallback) {      errorCallback(e);    }  });};function handleResponse(response, callback, errorCallback) {  let rawData = '';  response.on('data', (chunk) => {    rawData += chunk;  });  response.on('end', () => {    if (response.statusCode >= 200 && response.statusCode  0) {    try {      data = JSON.parse(rawData);    } catch (e) {      console.log('Response is not JSON.');      if (e) {        console.log(e);      }      data = {};    }  }  return data;}function getOptions(req, url) {    // 这里只是一个占位符,实际项目中需要根据请求构造 options 对象    return {        hostname: new URL(url).hostname,        path: new URL(url).pathname,        method: 'GET'    };}

编写测试用例

接下来,我们将使用 Jest 编写测试用例来验证该函数的行为。

立即学习“Java免费学习笔记(深入)”;

创建测试文件: 创建一个名为 yourModule.test.js 的文件(与包含 get 函数的模块同名,后缀为 .test.js)。

引入模块和 Jest 函数:

const module = require('./yourModule'); // 替换为你的模块路径const https = require('https');

编写测试套件: 使用 describe 函数创建一个测试套件,用于组织相关的测试用例。

describe("get", () => {  // 测试用例将在这里编写});

编写测试用例: 使用 it 函数编写单个测试用例。每个测试用例应关注函数的一个特定方面。

模拟成功的响应:

it("should get a successful response from a valid URL", (done) => {  const url = "https://www.google.com";  const expectedStatusCode = 200;  const expectedData = {    name: "Google",    domain: "www.google.com",  };  // Mock https.get  const mockResponse = {      statusCode: expectedStatusCode,      on: (event, cb) => {          if (event === 'data') {              cb(JSON.stringify(expectedData));          }          if (event === 'end') {              cb();          }      }  };  const mockHttpsGet = jest.fn((options, callback) => {      callback(mockResponse);      return {          on: () => {} // 模拟 on('error')      };  });  https.get = mockHttpsGet;  module.get(null, url, (data) => {    expect(data).toEqual(expectedData);    expect(mockHttpsGet).toHaveBeenCalledTimes(1);    done(); // 通知 Jest 测试完成  }, (error) => {      fail('Should not have called error callback');      done();  });});

解释:

我们首先定义了期望的 URL、状态码和数据。然后,我们使用 jest.fn() 创建了一个 https.get 的模拟函数,该函数返回一个模拟的 response 对象,其中包含期望的状态码和数据。我们使用 https.get = mockHttpsGet; 将 https.get 替换为我们的模拟函数。我们调用 module.exports.get 函数,并验证回调函数是否接收到期望的数据,并且 https.get 是否被调用。done() 函数用于通知 Jest 测试用例已完成,因为 module.exports.get 函数是异步的。

模拟错误的响应:

it("should get an error response from an invalid URL", (done) => {  const url = "https://www.google.com/asdfasdf";  const expectedStatusCode = 404;  // Mock https.get  const mockResponse = {      statusCode: expectedStatusCode,      on: (event, cb) => {          if (event === 'data') {              cb(''); // 模拟空数据          }          if (event === 'end') {              cb();          }      }  };  const mockHttpsGet = jest.fn((options, callback) => {      callback(mockResponse);      return {          on: (event, cb) => {              if (event === 'error') {                  // 模拟错误                  cb(new Error('Request failed with status code 404'));              }          }      };  });  https.get = mockHttpsGet;  module.get(null, url, null, (error) => {      expect(mockHttpsGet).toHaveBeenCalledTimes(1);      done();  });});

解释:

与成功响应的测试用例类似,我们模拟了 https.get 函数,但这次我们返回一个具有错误状态码的模拟响应。我们验证了 errorCallback 是否被调用。

测试 JSON 响应:

it("should get a JSON response", (done) => {  const url = "https://api.github.com/users/bard";  const expectedStatusCode = 200;  const expectedData = {    login: "bard",    name: "Bard",    email: "[email protected]",  };  // Mock https.get  const mockResponse = {      statusCode: expectedStatusCode,      on: (event, cb) => {          if (event === 'data') {              cb(JSON.stringify(expectedData));          }          if (event === 'end') {              cb();          }      }  };  const mockHttpsGet = jest.fn((options, callback) => {      callback(mockResponse);      return {          on: () => {}      };  });  https.get = mockHttpsGet;  module.get(null, url, (data) => {    expect(data).toEqual(expectedData);    expect(mockHttpsGet).toHaveBeenCalledTimes(1);    done();  }, (error) => {      fail('Should not have called error callback');      done();  });});

解释:

此测试用例验证了当 API 返回 JSON 响应时,module.exports.get 函数是否正确解析 JSON 数据并将其传递给回调函数。

运行测试

在终端中,运行以下命令来运行测试:

npm test

Jest 将运行所有测试用例,并显示测试结果。

注意事项

清理模拟: 在每个测试用例之后,使用 jest.clearAllMocks() 清理模拟,以避免测试用例之间的干扰。异步测试: 由于 module.exports.get 函数是异步的,因此需要使用 done() 回调函数或 async/await 来处理异步测试。错误处理: 确保测试用例覆盖了所有可能的错误情况,例如无效的 URL、网络错误等。Mock 的范围: 确保 mock 的范围尽可能的小,只 mock 必要的函数或模块,避免过度 mock。测试覆盖率: 考虑使用 Jest 的测试覆盖率功能来确保你的测试用例覆盖了所有重要的代码路径。

总结

本文介绍了如何使用 Jest 框架为 JavaScript REST GET 请求编写单元测试。通过模拟 HTTP 请求、验证响应状态码和数据,以及处理错误情况,你可以构建健壮可靠的测试用例,确保代码质量。 记住,良好的单元测试是高质量软件的基础。通过编写全面的测试用例,你可以及早发现和修复错误,提高代码的可维护性和可扩展性。

以上就是使用 Jest 进行 JavaScript REST GET 请求的单元测试的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1510260.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月20日 05:51:10
下一篇 2025年12月20日 05:51:21

相关推荐

  • Node.js服务端JavaScript性能优化策略

    合理利用异步非阻塞特性,避免阻塞操作,控制并发;2. 启用缓存与压缩,优化静态资源传输;3. 优化代码减少内存泄漏与性能开销;4. 使用cluster模块和PM2实现多核利用与进程管理,提升整体性能。 提升Node.js服务端JavaScript性能,关键在于合理利用其异步非阻塞特性、优化资源使用和…

    2025年12月20日
    000
  • 在React中实现级联选择器:动态更新第二个Select选项的教程

    本教程将指导您如何在react应用中实现级联选择器功能。当一个`select`(如类型选择)的值发生变化时,另一个`select`(如父菜单选择)的选项列表将根据新值动态更新。我们将利用react的`usestate`管理组件状态,并通过`useeffect`钩子在依赖项变化时触发数据获取,从而实现…

    2025年12月20日
    000
  • React 表单状态管理:使用 useReducer 在多个组件间共享状态

    本文旨在解决 React 应用中表单状态管理的问题,特别是当需要在多个组件间共享和更新状态时。我们将探讨如何使用 `useReducer` hook 将表单状态提升到父组件,并通过 props 将状态和更新函数传递给子组件,从而实现状态的集中管理和组件间的同步更新。通过本文,你将学会如何有效地在 R…

    2025年12月20日
    000
  • 使用 jsPDF 和 React.js 实现内容自动分页

    本文档旨在解决在使用 jsPDF 和 React.js 生成 PDF 文件时,内容超出页面高度导致重叠的问题。通过配置 `autoPaging` 选项,可以实现内容自动分页,确保 PDF 文档的完整性和可读性。本文将提供详细的代码示例和配置说明,帮助开发者轻松实现此功能。 在使用 jsPDF 和 R…

    2025年12月20日
    000
  • 理解 Next.js onClick 事件与服务器/客户端组件

    本文深入探讨了 Next.js 中 `onClick` 事件处理的常见陷阱及解决方案,重点解析了服务器组件与客户端组件的核心概念。通过示例代码,阐明了如何正确绑定事件处理器,并理解 `alert` 等浏览器API为何在服务器组件中报错,以及何时需要使用 `”use client&#822…

    2025年12月20日
    000
  • JavaScript动态创建元素事件监听:实现可开关菜单的正确姿势

    本文旨在解决javascript中动态创建dom元素(如菜单)后,无法正确为其绑定关闭事件的问题。核心在于理解事件监听器必须在元素被创建并添加到dom后才能有效绑定。文章将提供详细的解决方案,包括示例代码和最佳实践,确保动态ui组件的交互功能正常运行。 引言:动态UI与事件监听的挑战 在现代Web开…

    2025年12月20日
    000
  • 使用 jsPDF 和 React 实现内容超出页面自动分页

    本文档旨在解决在使用 jsPDF 和 React.js 生成 PDF 文件时,内容超出页面范围导致重叠的问题。通过 `pdf.html()` 方法将 HTML/React 元素转换为 PDF 时,配置 `autoPaging` 选项可以实现自动分页,确保内容完整显示,避免页面内容重叠。 在使用 js…

    2025年12月20日
    000
  • JavaScript数据可视化进阶

    答案是%ignore_a_1%进阶需以叙事为核心,结合工具深度与交互设计。首先理解场景,选用D3.js、Chart.js或ECharts等工具,挖掘其数据驱动、动态更新与插件扩展能力;其次优化性能,通过Web Workers、LTTB算法和Canvas渲染处理大规模数据;再者增强交互,实现跨图表联动…

    2025年12月20日
    000
  • Chrome扩展开发:解决图片资源加载失败的完整指南

    本文详细阐述了chrome扩展程序中图片资源加载失败的常见原因及解决方案。核心在于理解`manifest.json`中的`web_accessible_resources`配置,并掌握在内容脚本或动态生成元素中通过`chrome.runtime.geturl()`函数正确引用扩展内部图片资源的最佳实…

    2025年12月20日
    000
  • JavaScript剪切板操作权限

    答案:现代浏览器中JavaScript操作剪切板需用户授权,通过Clipboard API的writeText()和readText()方法实现;写入可在用户手势触发时直接调用并捕获异常,读取需通过Permissions API检查权限并在安全上下文中请求用户同意,移动端兼容性需注意。 在现代浏览器…

    2025年12月20日
    000
  • 解决 Cloudinary 上传后临时文件夹未删除的问题

    本文旨在解决在使用 Cloudinary 上传文件后,临时文件夹中的文件未能自动删除的问题。我们将探讨导致此问题的原因,并提供有效的解决方案,包括代码示例和注意事项,以确保您的后端系统在上传完成后保持清洁,避免不必要的资源占用。 在使用 Cloudinary 进行文件上传时,开发者经常会遇到一个问题…

    2025年12月20日
    000
  • 无XHR请求时提取JavaScript动态生成内容的教程

    本教程探讨了在爬取网页时,当目标内容由javascript动态生成且无明显xhr请求时的数据提取策略。我们将揭示数据可能已内嵌于初始html或js代码中,并演示如何通过检查页面源代码、识别关键标识符来定位并提取这些隐藏的json格式数据,从而实现高效的网页内容抓取。 挑战:JavaScript动态内…

    2025年12月20日
    000
  • 解决OpenAI微调模型“模型不存在”错误的指南

    在使用openai微调模型时,若遇到“the model `xxxxx` does not exist”错误,通常是由于api端点选择不当。本教程将详细阐述如何根据微调模型的基础类型(gpt-3或gpt-3.5 turbo)选择正确的api端点(completions api或chat comple…

    2025年12月20日
    000
  • JavaScript国际化本地化API详解

    答案:Intl对象提供日期、数字、字符串排序和复数规则的本地化支持,通过DateTimeFormat、NumberFormat、Collator和PluralRules实现%ignore_a_2%应用的格式化与比较,适配不同地区用户需求。 JavaScript 的国际化与本地化能力主要依赖于 ECM…

    2025年12月20日
    000
  • JavaScript OAuth认证流程实现

    OAuth 2.0授权码流程通过前端重定向获取code,后端用code换取token,确保第三方应用安全访问用户资源而不暴露密码。 OAuth 是一种开放标准,允许用户在不暴露密码的情况下授权第三方应用访问其资源。在 JavaScript 中实现 OAuth 认证流程,通常用于前端应用(如 Reac…

    2025年12月20日
    000
  • JavaScript可选链与空值合并运算

    可选链(?.)允许安全访问嵌套属性,避免访问 null 或 undefined 时出错;空值合并(??)仅在值为 null 或 undefined 时提供默认值,不干扰 0、false 等合法值。两者结合如 user?.profile?.name ?? ‘匿名用户’,可高效处…

    2025年12月20日
    000
  • 如何用JavaScript实现有限状态机管理复杂流程?

    答案:JavaScript通过定义状态和事件实现有限状态机,核心是封装状态转换逻辑。使用类可复用FSM,支持配置化与钩子函数,适用于订单、表单等复杂流程管理,提升代码可维护性。 用JavaScript实现有限状态机(Finite State Machine, FSM)能有效管理复杂流程,比如订单处理…

    2025年12月20日
    000
  • JavaScript原型链继承机制深入剖析

    JavaScript继承基于原型链,通过构造函数的prototype与实例的[[Prototype]]链接实现属性查找;经典继承方式是将子类原型设为父类实例,但存在引用共享、无法传参等问题;因此推荐寄生组合式继承,即在子类构造函数中用call调用父类构造函数继承实例属性,并用Object.creat…

    2025年12月20日
    000
  • JavaScript持续集成与部署

    持续集成与部署(CI/CD)通过自动化测试、构建和部署提升JavaScript项目交付效率。1. CI指频繁合并代码并自动运行测试以快速发现错误;2. CD在CI通过后自动将应用部署至生产环境;3. 常用工具包括GitHub Actions、GitLab CI/CD、CircleCI和Jenkins…

    2025年12月20日
    000
  • Solid.js 文件上传指南:解决文件为空的问题

    本文旨在帮助开发者解决在使用 Solid.js 实现多文件上传时遇到的文件内容为空的问题。我们将探讨 `createSignal` 和 `createStore` 在处理文件数组时的差异,并提供一个完整的、可运行的 Solid.js 文件上传示例,确保后端能够正确接收和处理上传的文件。 理解 cre…

    2025年12月20日
    000

发表回复

登录后才能评论
关注微信