」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 掌握 Cypress 中的模擬與存根:綜合指南

掌握 Cypress 中的模擬與存根:綜合指南

發佈於2024-07-31
瀏覽:574

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]刪除
最新教學 更多>
  • XAMPP(Windows)中的MySQL客戶端的“ .my.cnf”文件在哪裡?
    XAMPP(Windows)中的MySQL客戶端的“ .my.cnf”文件在哪裡?
    在XAMPP(Windows)中為MySQL客戶端確定“ .my.cnf”的位置自動讀取的文件放置,以確保命令行client會自動讀取“ .my.cnf”文件,將其放置在以下位置:手動配置如果您喜歡將“ .my.cnf”文件放在其他位置,則需要使用 - defaults-file選項手動指定其位...
    程式設計 發佈於2025-02-06
  • 如何從PHP服務器發送文件?
    如何從PHP服務器發送文件?
    將文件發送到user
    程式設計 發佈於2025-02-06
  • 在編譯和運行時,如何處理常數的精度?
    在編譯和運行時,如何處理常數的精度?
    如何在常數上執行算術Storage and Representation of ConstantsUntyped constants do not occupy memory at runtime.它們僅在彙編過程中存在,並且不存在於可執行文件中。編譯器從其默認類型中派生非類型常數的類型。例如,在...
    程式設計 發佈於2025-02-06
  • 哪種方法更有效地用於點 - 填點檢測:射線跟踪或matplotlib \的路徑contains_points?
    哪種方法更有效地用於點 - 填點檢測:射線跟踪或matplotlib \的路徑contains_points?
    在Python 射線tracing方法Matplotlib's path.contains_points FunctionMatplotlib's path.contains_points function employs a路徑對象表示多邊形。它檢查給定點是否位於定義路徑內。 T...
    程式設計 發佈於2025-02-06
  • 打印大HTML表時,CSS如何防止行斷裂?
    打印大HTML表時,CSS如何防止行斷裂?
    打印大型html表:CSS方法通過指定Page-Break-inside:auto for 元素,瀏覽器試圖在啟動頁面之前在當前頁面上完成表格休息。此外,設置頁面折線:避免使用元素可以防止行分為跨頁。 保留標題和頁腳可見性,使用page-break-after-fer-fer-fer-fer-fe...
    程式設計 發佈於2025-02-06
  • GO中的緩衝渠道是否可以保證與一個生產者和一個消費者一起有序的數據傳輸?
    GO中的緩衝渠道是否可以保證與一個生產者和一個消費者一起有序的數據傳輸?
    [2從生產者到消費者的數據傳輸? 問題: 答案: 使用緩衝頻道: 也意味著生產者的數據插入順序不一定與消費者檢索數據的數據相同。 相反,無封閉的頻道: 保證遞送順序: 操作順序: send < - >接收 send < - > buffer < - >接收 多個生產者/消費者:在這種情況下,數據傳...
    程式設計 發佈於2025-02-06
  • 默認情況下,如何使PDO拋出異常?
    默認情況下,如何使PDO拋出異常?
    PDO異常處理配置 1。構造函數參數您可以將選項數組傳遞給PDO構造函數,包括錯誤處理模式: 2。 Wrapper ClassAlternatively, you can create a wrapper class that extends PDO and always sets the e...
    程式設計 發佈於2025-02-06
  • 如何使用組在MySQL中旋轉數據?
    如何使用組在MySQL中旋轉數據?
    在關係數據庫中使用mysql組使用mysql組來調整查詢結果。在這裡,我們面對一個共同的挑戰:使用組的組將數據從基於行的基於列的基於列的轉換。通過子句以及條件匯總函數,例如總和或情況。讓我們考慮以下查詢: select d.data_timestamp, sum(data_id = 1 tata...
    程式設計 發佈於2025-02-06
  • 如何使用Python的記錄模塊實現自定義處理?
    如何使用Python的記錄模塊實現自定義處理?
    使用Python的Loggging Module 確保正確處理和登錄對於疑慮和維護的穩定性至關重要Python應用程序。儘管手動捕獲和記錄異常是一種可行的方法,但它可能乏味且容易出錯。 解決此問題,Python允許您覆蓋默認的異常處理機制,並將其重定向為登錄模塊。這提供了一種方便而係統的方法來捕獲...
    程式設計 發佈於2025-02-06
  • Java Shift Operators:`>'vs.`>>' - 有什麼區別?
    Java Shift Operators:`>'vs.`>>' - 有什麼區別?
    >`vs.`>>>` - 有什麼區別? “ />>`vs.`>>>` - 有什麼區別? “ />
    程式設計 發佈於2025-02-06
  • 在映射到MySQL枚舉列時,如何確保冬眠保留值?
    在映射到MySQL枚舉列時,如何確保冬眠保留值?
    在hibernate中保存枚舉值:故障排除錯誤的列type ,他們各自的映射至關重要。在Java中使用枚舉類型時,至關重要的是,建立冬眠的方式如何映射到基礎數據庫。 在您的情況下,您已將MySQL列定義為枚舉,並在Java中創建了相應的枚舉代碼。但是,您遇到以下錯誤:“ MyApp中的錯誤列類型...
    程式設計 發佈於2025-02-06
  • 如何干淨地刪除匿名JavaScript事件處理程序?
    如何干淨地刪除匿名JavaScript事件處理程序?
    在這里工作/},false); 不幸的是,答案是否。除非在Creation中存儲對處理程序的引用。 要解決此問題,請考慮將事件處理程序存儲在中心位置,例如頁面的主要對象,請考慮將事件處理程序存儲在中心位置,否則無法清理匿名事件處理程序。 。這允許在需要時輕鬆迭代和清潔處理程序。
    程式設計 發佈於2025-02-06
  • 如何從PHP中的UTF-8字符中提取UCS-2代碼點?
    如何從PHP中的UTF-8字符中提取UCS-2代碼點?
    [2對於給定的UTF-8字符串中的字符。為此,可以定義自定義的PHP函數。 首先,了解UTF-8編碼方案很重要。每個字符由1到4個字節的序列表示,具體取決於其Unicode代碼點。每個字節大小的範圍如下: 0xxxxx:1 byte 110xxxxxxxxxx:2 bytes 11110:4字節...
    程式設計 發佈於2025-02-06
  • 如何正確管理Firebase ValueEventListeners以優化應用程序性能?
    如何正確管理Firebase ValueEventListeners以優化應用程序性能?
    在firebase 在單獨的線程上運行firebase valueeventlistener,從而引發了有關線程管理的關注點。為了確保有效的資源利用,應根據應用程序的生命週期進行適當時刪除valueEventListeners。 何時刪除valueEventListeners 作為一般規則,您應在...
    程式設計 發佈於2025-02-06
  • 在Windows上運行Python腳本時,如何隱藏控制台窗口?
    在Windows上運行Python腳本時,如何隱藏控制台窗口?
    在python 在Python中編寫IRC機器人時會出現這樣的方案,在該機器人的功能中應在沒有可見的控制器的情況下運行。為此,您可以使用以下簡單但有效的技術:解決方案,您可以通過使用一個用一個腳本保存python腳本來抑制控制台窗口“ .pyw”擴展。 示例此模式打開控制台窗口,允許訪問程序的輸出...
    程式設計 發佈於2025-02-06

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3