When it comes to end-to-end testing, controlling external dependencies can significantly enhance the reliability and speed of your tests. Cypress, a modern web testing framework, offers powerful capabilities for mocking and stubbing HTTP requests, allowing you to simulate different scenarios without relying on actual backend services. In this post, we’ll explore how to leverage Cypress’s cy.intercept() for mocking and stubbing API calls to make your tests more robust and efficient.
Mocking and stubbing HTTP requests in Cypress provide several benefits:
If you haven't installed Cypress yet, you can set it up with the following commands:
npm install cypress --save-dev npx cypress open
Ensure you have the basic Cypress project structure ready before proceeding.
The cy.intercept() command in Cypress allows you to intercept and modify network requests and responses. It replaces the deprecated cy.route() command and offers more flexibility and power.
Basic Example
Let's start with a basic example where we mock an API response:
// 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'); }); });
In this example, we intercept a GET request to /api/todos and provide a mocked response. The as('getTodos') assigns an alias to the intercepted request, making it easier to reference in your tests.
Simulating Errors
You can simulate various HTTP error statuses to test how your application handles them:
// 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'); }); });
Delaying Responses
To test how your application handles slow network responses, you can introduce a delay:
// 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'); }); });
Conditional Mocking
You can conditionally mock responses based on the request body or headers:
// 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'); }); });
Mocking and stubbing in Cypress are powerful techniques that can make your tests faster, more reliable, and easier to maintain. By intercepting HTTP requests and providing custom responses, you can create a wide range of testing scenarios without relying on external services. Follow the best practices and examples provided in this guide to master mocking and stubbing in your Cypress tests.
Happy testing!
Disclaimer: All resources provided are partly from the Internet. If there is any infringement of your copyright or other rights and interests, please explain the detailed reasons and provide proof of copyright or rights and interests and then send it to the email: [email protected] We will handle it for you as soon as possible.
Copyright© 2022 湘ICP备2022001581号-3