”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 掌握 Cypress 中的模拟和存根:综合指南

掌握 Cypress 中的模拟和存根:综合指南

发布于2024-07-31
浏览:709

Mastering Mocking and Stubbing in Cypress: A Comprehensive Guide

介绍

当涉及到端到端测试时,控制外部依赖关系可以显着提高测试的可靠性和速度。 Cypress 是一个现代 Web 测试框架,提供强大的模拟和存根 HTTP 请求的功能,允许您模拟不同的场景,而无需依赖实际的后端服务。在这篇文章中,我们将探讨如何利用 Cypress 的 cy.intercept() 进行模拟和存根 API 调用,以使您的测试更加健壮和高效。

为什么要进行模拟和存根?

Cypress 中的模拟和存根 HTTP 请求有几个好处:

  1. 隔离: 独立于后端测试前端,确保您的测试不受后端更改或中断的影响。
  2. 速度:通过避免实际的网络调用来减少测试执行时间。
  3. 可靠性:通过模拟各种响应和边缘情况创建可预测且一致的测试条件。
  4. 灵活性: 测试不同的场景,例如错误、响应缓慢和不同的数据负载,而无需更改后端。

设置赛普拉斯

如果您还没有安装Cypress,您可以使用以下命令进行设置:

npm install cypress --save-dev
npx cypress open

在继续之前,请确保您已准备好基本的 Cypress 项目结构。

使用 cy.intercept()

Cypress 中的 cy.intercept() 命令允许您拦截和修改网络请求和响应。它取代了已弃用的 cy.route() 命令,并提供了更多的灵活性和功能。

基本示例
让我们从一个模拟 API 响应的基本示例开始:

// cypress/integration/mock_basic.spec.js
describe('Mocking API Responses', () => {
  it('should display mocked data', () => {
    cy.intercept('GET', '/api/todos', {
      statusCode: 200,
      body: [
        { id: 1, title: 'Mocked Todo 1', completed: false },
        { id: 2, title: 'Mocked Todo 2', completed: true }
      ]
    }).as('getTodos');

    cy.visit('/todos');
    cy.wait('@getTodos');

    cy.get('.todo').should('have.length', 2);
    cy.get('.todo').first().should('contain.text', 'Mocked Todo 1');
  });
});

在此示例中,我们拦截对 /api/todos 的 GET 请求并提供模拟响应。 as('getTodos') 为拦截的请求分配一个别名,使其更容易在测试中引用。

高级模拟场景

模拟错误
您可以模拟各种 HTTP 错误状态来测试您的应用程序如何处理它们:

// cypress/integration/mock_errors.spec.js
describe('Simulating API Errors', () => {
  it('should display error message on 500 response', () => {
    cy.intercept('GET', '/api/todos', {
      statusCode: 500,
      body: { error: 'Internal Server Error' }
    }).as('getTodosError');

    cy.visit('/todos');
    cy.wait('@getTodosError');

    cy.get('.error-message').should('contain.text', 'Failed to load todos');
  });
});

延迟响应
要测试您的应用程序如何处理缓慢的网络响应,您可以引入延迟:

// cypress/integration/mock_delays.spec.js
describe('Simulating Slow Responses', () => {
  it('should display loading indicator during slow response', () => {
    cy.intercept('GET', '/api/todos', (req) => {
      req.reply((res) => {
        res.delay(2000); // 2-second delay
        res.send({ body: [] });
      });
    }).as('getTodosSlow');

    cy.visit('/todos');
    cy.get('.loading').should('be.visible');
    cy.wait('@getTodosSlow');
    cy.get('.loading').should('not.exist');
  });
});

模拟特定场景

条件模拟
您可以根据请求正文或标头有条件地模拟响应:

// cypress/integration/mock_conditional.spec.js
describe('Conditional Mocking', () => {
  it('should mock response based on request body', () => {
    cy.intercept('POST', '/api/todos', (req) => {
      if (req.body.title === 'Special Todo') {
        req.reply({
          statusCode: 201,
          body: { id: 999, title: 'Special Todo', completed: false }
        });
      }
    }).as('createTodo');

    cy.visit('/todos');
    cy.get('input[name="title"]').type('Special Todo');
    cy.get('button[type="submit"]').click();

    cy.wait('@createTodo');
    cy.get('.todo').should('contain.text', 'Special Todo');
  });
});

模拟和存根的最佳实践

  1. 使用别名: 始终使用 .as() 为拦截的请求分配别名。这使您的测试更具可读性且更易于调试。
  2. 与Fixtures结合:将大量模拟数据存储在fixture文件中,以获得更好的可维护性和可读性。使用 cy.fixture() 加载灯具。
  3. 避免过度模拟: 仅模拟测试所需的内容。过度模拟可能会导致测试无法反映真实场景。
  4. 测试真实的 API 调用:定期针对真实后端进行测试,以确保您的应用程序能够正确处理实际数据。

结论

Cypress 中的模拟和存根是强大的技术,可以使您的测试更快、更可靠、更易于维护。通过拦截 HTTP 请求并提供自定义响应,您可以创建各种测试场景,而无需依赖外部服务。按照本指南中提供的最佳实践和示例来掌握 Cypress 测试中的模拟和存根。

测试愉快!

版本声明 本文转载于:https://dev.to/aswani25/mastering-mocking-and-stubbing-in-cypress-a-comprehensive-guide-3028?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何使用PHP从XML文件中有效地检索属性值?
    如何使用PHP从XML文件中有效地检索属性值?
    从php 您的目标可能是检索“ varnum”属性值,其中提取数据的传统方法可能会使您感到困惑。 - > attributes()为$ attributeName => $ attributeValue){ echo $ attributeName,'=“',$ at...
    编程 发布于2025-02-06
  • 如何从Python中的字符串中删除表情符号:固定常见错误的初学者指南?
    如何从Python中的字符串中删除表情符号:固定常见错误的初学者指南?
    从python 导入编解码器 导入 text = codecs.decode('这狗\ u0001f602'.encode('utf-8'),'utf-8') 印刷(文字)#带有表情符号 emoji_pattern = re.compile(“ [”...
    编程 发布于2025-02-06
  • 在映射到MySQL枚举列时,如何确保冬眠保留值?
    在映射到MySQL枚举列时,如何确保冬眠保留值?
    在hibernate中保存枚举值:故障排除错误的列type ,他们各自的映射至关重要。在Java中使用枚举类型时,至关重要的是,建立冬眠的方式如何映射到基础数据库。在您的情况下,您已将MySQL列定义为枚举,并在Java中创建了相应的枚举代码。但是,您遇到以下错误:“ MyApp中的错误列类型。...
    编程 发布于2025-02-06
  • 如何使用char_length()在mySQL中按字符串长度对数据进行排序?
    如何使用char_length()在mySQL中按字符串长度对数据进行排序?
    [2使用内置的char_length()function。 char_length()和length() 此查询将从指定的表中检索所有行,并基于上升顺序对它们进行排序指定列的字符长度。带有更长字符串的行将出现在结果的底部。
    编程 发布于2025-02-06
  • 如何使用代理身份验证创建GO HTTP客户端?
    如何使用代理身份验证创建GO HTTP客户端?
    在使用Authentication 时,使用authentication时要求。当将代理支持集成到现有的第三方代码中时,这可能会构成挑战。在这种情况下,另一种方法是使用所需的代理配置创建自定义的HTTP客户端。然后,可以在第三方软件包中使用此客户端来代替默认的HTTP客户端。以下是如何使用http...
    编程 发布于2025-02-06
  • 如何使用Python的记录模块实现自定义处理?
    如何使用Python的记录模块实现自定义处理?
    使用Python的Loggging Module 确保正确处理和登录对于疑虑和维护的稳定性至关重要Python应用程序。尽管手动捕获和记录异常是一种可行的方法,但它可能乏味且容易出错。解决此问题,Python允许您覆盖默认的异常处理机制,并将其重定向为登录模块。这提供了一种方便而系统的方法来捕获和...
    编程 发布于2025-02-06
  • 如何在没有404个错误的情况下使用泽西2.0提供静态资源(例如index.html)?
    如何在没有404个错误的情况下使用泽西2.0提供静态资源(例如index.html)?
    在泽西岛估算静态资源的404错误映射拦截所有传入的请求,没有留出空间的网络容器来提供静态内容。为了解决此问题,我们深入探究了过滤器的领域,尤其是com.sun.jersey.spi.container.servlet.servlet.servlet.servletcontainer for Jer...
    编程 发布于2025-02-06
  • 如何干净地删除匿名JavaScript事件处理程序?
    如何干净地删除匿名JavaScript事件处理程序?
    在这里工作/},false); 不幸的是,答案是否。除非在Creation中存储对处理程序的引用。要解决此问题,请考虑将事件处理程序存储在中心位置,例如页面的主要对象,请考虑将事件处理程序存储在中心位置,否则无法清理匿名事件处理程序。 。这允许在需要时轻松迭代和清洁处理程序。
    编程 发布于2025-02-06
  • 我可以将加密从McRypt迁移到OpenSSL,并使用OpenSSL迁移MCRYPT加密数据?
    我可以将加密从McRypt迁移到OpenSSL,并使用OpenSSL迁移MCRYPT加密数据?
    将我的加密库从mcrypt升级到openssl 问题:是否可以将我的加密库从McRypt升级到OpenSSL?如果是这样?使用openssl?答案:可以使用mcrypt数据加密数据,可以使用openssl。关于如何使用openssl对McRypt进行加密的数据: openssl_decrypt...
    编程 发布于2025-02-06
  • 如何使用FormData()处理多个文件上传?
    如何使用FormData()处理多个文件上传?
    )处理多个文件输入时,通常需要处理多个文件上传时,通常是必要的。可以将fd.append("fileToUpload[]", files[x]);方法用于此目的,允许您在单个请求中发送多个文件。 初始尝试 在JavaScript中,一种常见方法是:); 但是,此代码仅处理第一...
    编程 发布于2025-02-06
  • HTML格式标签
    HTML格式标签
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    编程 发布于2025-02-06
  • 您什么时候应该使用_mm_sfence,_mm_lfence和_mm_mfence?
    您什么时候应该使用_mm_sfence,_mm_lfence和_mm_mfence?
    Memory Ordering in x86x86 CPUs have a strongly有序的内存模型,但是C和C的模型较弱。因此,需要其他预防措施以确保正确的内存排序并防止数据损坏或种族条件。 _ mm_sfence _ mm_lfence Summary在NT存储之后使用_mm_sfe...
    编程 发布于2025-02-06
  • 大批
    大批
    [2 数组是对象,因此它们在JS中也具有方法。 切片(开始):在新数组中提取部分数组,而无需突变原始数组。 令arr = ['a','b','c','d','e']; // USECASE:提取直到索引作...
    编程 发布于2025-02-06
  • 如何使用替换指令在GO MOD中解析模块路径差异?
    如何使用替换指令在GO MOD中解析模块路径差异?
    克服go mod中的模块路径差异 coreos/bbolt:github.com/coreos/ [email受保护]:解析go.mod:模块将其路径声明为:go.etcd.io/bbolt `要解决此问题,您可以在go.mod文件中使用替换指令。只需在go.mod的末尾添加以下行:[&& &...
    编程 发布于2025-02-06
  • 如何使用newtonsoft的json.net将JSON列为C#对象列表?
    如何使用newtonsoft的json.net将JSON列为C#对象列表?
    [2 C#对象的列表,利用Newtonsoft的JSON.NET库,同时仅关注目标类中的特定属性。 1。将JSON转换为c#类结构:利用JSON2CSHARP.com的JSON转换器将JSON转换为C#类结构。 2。创建目标对象类:定义一个类似于预期对象结构的c#类。 3。值得注意的json字符串:...
    编程 发布于2025-02-06

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3