Bird
Raised Fist0
Cypresstesting~15 mins

Stubbing responses in Cypress - Build an Automation Script

Choose your learning style10 modes available
Stub API response for user data and verify UI display
Preconditions (2)
Step 1: Open the web application home page at http://localhost:3000
Step 2: Stub the GET /api/users API call to return a fixed list of users: [{id:1, name:'Alice'}, {id:2, name:'Bob'}]
Step 3: Reload the page to trigger the API call
Step 4: Verify that the user list on the page shows 'Alice' and 'Bob'
✅ Expected Result: The page displays the stubbed user names 'Alice' and 'Bob' in the user list instead of real API data
Automation Requirements - Cypress
Assertions Needed:
Verify the GET /api/users request is stubbed and called
Verify the UI displays the stubbed user names 'Alice' and 'Bob'
Best Practices:
Use cy.intercept() to stub network responses
Use alias for intercepted requests and wait for them
Use data-test attributes or semantic selectors for UI elements
Avoid hardcoded waits; use Cypress commands for synchronization
Automated Solution
Cypress
describe('User list with stubbed API response', () => {
  it('should display stubbed users Alice and Bob', () => {
    cy.intercept('GET', '/api/users', {
      statusCode: 200,
      body: [
        { id: 1, name: 'Alice' },
        { id: 2, name: 'Bob' }
      ]
    }).as('getUsers')

    cy.visit('http://localhost:3000')

    cy.wait('@getUsers')

    cy.get('[data-test=user-list]').should('contain.text', 'Alice')
    cy.get('[data-test=user-list]').should('contain.text', 'Bob')
  })
})

This test uses cy.intercept() to stub the GET request to /api/users. We provide a fixed response with two users, Alice and Bob.

We give this intercept an alias @getUsers so we can wait for it to complete with cy.wait(). This ensures the page has received the stubbed data before we check the UI.

We visit the page URL to trigger the API call. Then we check the user list element (selected by data-test=user-list) contains the names Alice and Bob.

This approach avoids flaky tests by synchronizing on the network call and uses semantic selectors for maintainability.

Common Mistakes - 3 Pitfalls
{'mistake': 'Using cy.wait(500) instead of waiting for the stubbed request', 'why_bad': 'Fixed waits can cause flaky tests if the network is slower or faster. It wastes time or causes failures.', 'correct_approach': "Use cy.wait('@alias') to wait for the intercepted request to complete."}
{'mistake': 'Not using an alias for the intercepted request', 'why_bad': 'Without an alias, you cannot wait for the request or verify it was called, reducing test reliability.', 'correct_approach': "Assign an alias with .as('name') and use cy.wait('@name') to synchronize."}
Selecting UI elements by brittle CSS selectors or XPath
Bonus Challenge

Now add data-driven testing with 3 different stubbed user lists and verify the UI for each

Show Hint

Practice

(1/5)
1. What is the main purpose of stubbing responses in Cypress testing?
easy
A. To fake server responses so tests run without a real backend
B. To speed up the browser rendering process
C. To automatically generate test data
D. To record user interactions for playback

Solution

  1. Step 1: Understand stubbing concept

    Stubbing means faking server responses so the app can be tested without a real backend.
  2. Step 2: Identify purpose in Cypress

    Cypress uses stubbing to isolate frontend tests from backend dependencies, making tests faster and more reliable.
  3. Final Answer:

    To fake server responses so tests run without a real backend -> Option A
  4. Quick Check:

    Stubbing = Fake server response [OK]
Hint: Stubbing fakes backend responses for isolated frontend tests [OK]
Common Mistakes:
  • Thinking stubbing speeds up browser rendering
  • Confusing stubbing with test data generation
  • Believing stubbing records user actions
2. Which of the following is the correct syntax to stub a GET request to '/api/data' with Cypress?
easy
A. cy.stub('GET', '/api/data', { fixture: 'data.json' })
B. cy.route('GET', '/api/data', { fixture: 'data.json' })
C. cy.intercept('GET', '/api/data', { fixture: 'data.json' })
D. cy.mock('GET', '/api/data', { fixture: 'data.json' })

Solution

  1. Step 1: Identify correct Cypress command

    The current Cypress command to stub network requests is cy.intercept().
  2. Step 2: Check method and parameters

    Using cy.intercept('GET', '/api/data', { fixture: 'data.json' }) correctly stubs a GET request with a fixture response.
  3. Final Answer:

    cy.intercept('GET', '/api/data', { fixture: 'data.json' }) -> Option C
  4. Quick Check:

    Use cy.intercept for stubbing requests [OK]
Hint: Use cy.intercept for stubbing, not cy.stub or cy.route [OK]
Common Mistakes:
  • Using cy.stub instead of cy.intercept
  • Using deprecated cy.route command
  • Using cy.mock which does not exist in Cypress
3. Given the code below, what will be the output of the test assertion?
cy.intercept('GET', '/users', { body: [{ id: 1, name: 'Alice' }] }).as('getUsers');
cy.visit('/users');
cy.wait('@getUsers').its('response.body[0].name').should('equal', 'Alice');
medium
A. Test passes because the stubbed response matches 'Alice'
B. Test fails because the alias '@getUsers' is not defined
C. Test fails because the response body is empty
D. Test throws a syntax error due to incorrect intercept usage

Solution

  1. Step 1: Analyze the intercept stub

    The intercept stubs a GET request to '/users' with a response body containing one user named 'Alice'.
  2. Step 2: Check the wait and assertion

    The test waits for '@getUsers' and asserts the first user's name equals 'Alice', which matches the stub.
  3. Final Answer:

    Test passes because the stubbed response matches 'Alice' -> Option A
  4. Quick Check:

    Stub response matches assertion = pass [OK]
Hint: Alias stub and assert matching response for pass [OK]
Common Mistakes:
  • Assuming alias is undefined without .as()
  • Thinking response body is empty
  • Confusing syntax of cy.intercept
4. Identify the error in the following Cypress stub code:
cy.intercept('POST', '/login', { statusCode: 200, body: { token: 'abc123' } });
cy.visit('/login');
cy.wait('@loginRequest');
medium
A. cy.visit must come before cy.intercept
B. The HTTP method 'POST' is invalid in cy.intercept
C. The response body must be a string, not an object
D. The alias '@loginRequest' is missing because the intercept was not aliased

Solution

  1. Step 1: Check alias usage

    The intercept is defined but not given an alias using .as(), so '@loginRequest' does not exist.
  2. Step 2: Understand wait on alias

    Waiting on '@loginRequest' fails because the alias was never created.
  3. Final Answer:

    The alias '@loginRequest' is missing because the intercept was not aliased -> Option D
  4. Quick Check:

    Alias missing causes wait failure [OK]
Hint: Always alias intercept with .as() before waiting [OK]
Common Mistakes:
  • Forgetting to add .as() to intercept
  • Thinking POST is invalid method
  • Believing response body must be string
5. You want to stub a GET request to '/products' that returns different responses based on a query parameter 'category'. Which is the best way to implement this in Cypress?
hard
A. Create multiple cy.intercept calls with the same URL but different responses
B. Use cy.intercept with a function handler to check req.query.category and send different responses
C. Use cy.intercept with a static response ignoring query parameters
D. Use cy.route with a fixture file for all categories

Solution

  1. Step 1: Understand dynamic stubbing need

    Different responses based on query parameters require conditional logic in the stub.
  2. Step 2: Use function handler in cy.intercept

    cy.intercept supports a function to inspect the request and send custom responses based on req.query.category.
  3. Final Answer:

    Use cy.intercept with a function handler to check req.query.category and send different responses -> Option B
  4. Quick Check:

    Function handler enables dynamic stubbing [OK]
Hint: Use function in cy.intercept for dynamic responses [OK]
Common Mistakes:
  • Trying multiple intercepts with same URL (only last applies)
  • Ignoring query parameters in stub
  • Using deprecated cy.route instead of cy.intercept
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard