エンドツーエンドのテストに関しては、外部依存関係を制御することでテストの信頼性と速度を大幅に向上させることができます。最新の Web テスト フレームワークである Cypress は、HTTP リクエストをモックおよびスタブするための強力な機能を提供し、実際のバックエンド サービスに依存せずにさまざまなシナリオをシミュレートできます。この投稿では、Cypress の cy.intercept() を利用して API 呼び出しをモックおよびスタブ化し、テストをより堅牢かつ効率的にする方法を検討します。
Cypress での HTTP リクエストのモックとスタブには、いくつかの利点があります。
Cypress をまだインストールしていない場合は、次のコマンドを使用してセットアップできます:
npm install cypress --save-dev npx cypress open
続行する前に、基本的な Cypress プロジェクト構造が準備されていることを確認してください。
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'); }); });
Cypress のモックとスタブは、テストをより高速に、より信頼性が高く、保守を容易にする強力なテクニックです。 HTTP リクエストをインターセプトし、カスタム応答を提供することで、外部サービスに依存せずに幅広いテスト シナリオを作成できます。このガイドで提供されているベスト プラクティスと例に従って、Cypress テストでのモックとスタブをマスターしてください。
テストをお楽しみください!
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3