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

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

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

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]刪除
最新教學 更多>
  • 為什麼在 C 語言中從字元中減去“0”會顯示其數值?
    為什麼在 C 語言中從字元中減去“0”會顯示其數值?
    解碼字元值:為什麼減去「0」會洩漏數字表示出現一個令人費解的問題:為什麼減去「0」會洩漏數字表示出現一個令人費解的問題:為什麼從a中減去“0” C 中的字元揭示了它所代表的數值? 為了解開這個謎團,讓我們深入研究ASCII(美國資訊交換標準代碼)領域,它為每個字元分配數字代碼。 '0'...
    程式設計 發佈於2024-12-21
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1 和 $array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建...
    程式設計 發佈於2024-12-21
  • 如何啟用和停用MySQL查詢稽核一小時?
    如何啟用和停用MySQL查詢稽核一小時?
    在MySQL 中啟用查詢審核如果您希望監控並記錄在MySQL 資料庫上執行的所有查詢一個小時,您可以可以開啟審核日誌記錄。 審核日誌記錄配置啟用審核日誌記錄和轉儲將日誌寫入文件,請在MySQL 控制台中執行以下命令:SET global log_output = 'FILE'; SET global...
    程式設計 發佈於2024-12-21
  • 如何使用 JavaScript 建立可懸停的選擇框選項?
    如何使用 JavaScript 建立可懸停的選擇框選項?
    可懸停選擇框選項當前的問題涉及創建一個選擇框,當將字段懸停在該選擇框上時,選項說明可見,而不是點選開啟options.實作為了實現此功能,我們利用了JavaScript方法:如下:$('#selectUl li:not(":first")').addClass('unselect...
    程式設計 發佈於2024-12-21
  • 解析 JSON 資料時如何解決“TypeError:字串索引必須是整數”?
    解析 JSON 資料時如何解決“TypeError:字串索引必須是整數”?
    避免「TypeError:字串索引必須是整數」當嘗試將JSON 檔案中的資料轉換為可理解的CSV 格式時,您可能會遇到“TypeError:字串索引必須是整數”錯誤。當像字典一樣存取字串的欄位時,會出現此錯誤。讓我們探索解決方案。 理解錯誤要理解該錯誤,需要注意的是,Python 中的字串不能像字典...
    程式設計 發佈於2024-12-21
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-12-21
  • 如何使用 jQuery 停用和啟用輸入欄位?
    如何使用 jQuery 停用和啟用輸入欄位?
    使用jQuery 停用與啟用輸入欄位使用jQuery 停用與啟用輸入欄位使用HTML 表單元件時,通常需要為使用者停用或啟用某些輸入欄位互動。 jQuery 提供了多種方法來完成這些任務。 禁用輸入字段$("input").prop('disabled', true);在jQue...
    程式設計 發佈於2024-12-21
  • 在 Go 中對 App Engine 範本進行單元測試時如何解決路徑問題?
    在 Go 中對 App Engine 範本進行單元測試時如何解決路徑問題?
    如何在Go 的單元測試中解決App Engine 模板的路徑規範使用App Engine 和Go 時,使用內建模板包可能會遇到挑戰在單元測試期間。具體來說,該問題是由於伺服器無法在測試環境中找到模板檔案的路徑而出現的。 問題原因在常規應用程式執行期間​​,目前目錄是 app.yaml 所在的應用程式...
    程式設計 發佈於2024-12-21
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSocke...
    程式設計 發佈於2024-12-21
  • 如何在 PHP 中求和日期間隔?
    如何在 PHP 中求和日期間隔?
    在PHP 中添加日期間隔在PHP 中,我們可能會遇到需要添加兩個或多個日期間隔來計算以小時和分鐘為單位的總持續時間的情況。要實現此總和,我們可以按照以下步驟操作:為每個時間間隔建立 DateTime 物件。 使用 diff() 方法計算每對物件之間的差異。 $a = new DateTime('14...
    程式設計 發佈於2024-12-21
  • 如何使用 jQuery 檢索“data-id”屬性值?
    如何使用 jQuery 檢索“data-id”屬性值?
    使用jQuery 存取data-id 屬性使用jQuery Quicksand 外掛程式時,通常需要檢索被點選元素的「data-id」屬性將資訊傳遞到各種Web 服務。以下介紹如何有效取得該屬性值:'data-id'屬性可以使用jQuery中的.attr()方法來存取。語法如下:$(...
    程式設計 發佈於2024-12-21
  • 如何透過一次查詢高效刪除多個MySQL表中的資料?
    如何透過一次查詢高效刪除多個MySQL表中的資料?
    在MySQL 中使用單一查詢從多個表中刪除資料當處理由公共欄位關聯的多個表時,可能需要刪除有關使用者的信息同時從所有表中。此查詢不是執行多個 DELETE 語句,而是探索在單一查詢中執行刪除的可能性。 建議的查詢涉及使用以分號分隔的多個 DELETE 語句:DELETE FROM table1 WH...
    程式設計 發佈於2024-12-21
  • 如何使用 Intent.putExtra() 在 Activity 之間傳送整數陣列?
    如何使用 Intent.putExtra() 在 Activity 之間傳送整數陣列?
    使用 Intent.putExtra() 發送數組在 Activity 之間傳輸資料時,可能需要傳遞數組等複雜的資料結構。本文探討如何使用 Intent.putExtra() 有效地將整數陣列從​​一個活動 (A) 傳送到另一個活動 (B)。 問題:In活動 A 中,初始化了一個整數數組,並打算將其...
    程式設計 發佈於2024-12-21
  • 如何強制瀏覽器刷新動態圖像以顯示更新?
    如何強制瀏覽器刷新動態圖像以顯示更新?
    使用Cachebreaker 進行動態影像刷新存取每次載入時提供新影像的動態影像來源時,強制刷新至關重要在網頁上顯示更新後的圖像。 在背景載入新映像並嘗試取代頁面上的現有映像時會出現此問題。儘管加載了新圖像,但在刷新頁面之前它可能不會顯示。 要解決此問題,可以將快取破壞器附加到映像URL 的末尾:n...
    程式設計 發佈於2024-12-21
  • 如何可靠地檢查 JavaScript 中特定類別是否存在?
    如何可靠地檢查 JavaScript 中特定類別是否存在?
    在確定 JavaScript 中元素類別的存在檢查元素的類別屬性時,通常需要驗證它是否包含特定類別。提供的程式碼利用 switch 語句來檢查元素的確切類別值,但此方法無法偵測部分匹配。 要解決此限制,請考慮使用 element.classList .contains 方法。此方法接受類別名稱作為參...
    程式設計 發佈於2024-12-21

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

Copyright© 2022 湘ICP备2022001581号-3