Bird
Raised Fist0
Cypresstesting~8 mins

Asserting response bodies in Cypress - Framework Patterns

Choose your learning style10 modes available
Framework Mode - Asserting response bodies
Folder Structure
  cypress/
  ├── e2e/
  │   ├── api/
  │   │   └── responseBodyAssertions.cy.js
  │   └── ui/
  │       └── sampleUI.cy.js
  ├── fixtures/
  │   └── sampleData.json
  ├── support/
  │   ├── commands.js
  │   └── e2e.js
  cypress.config.js
  
Test Framework Layers
  • Test Layer: Contains test files under cypress/e2e/. For asserting response bodies, tests are in cypress/e2e/api/.
  • Support Layer: Custom commands and reusable utilities in cypress/support/commands.js and e2e.js.
  • Fixtures Layer: Static test data stored in cypress/fixtures/ for predictable assertions.
  • Configuration Layer: cypress.config.js manages environment variables, base URLs, and browser settings.
Configuration Patterns

Use cypress.config.js to define base URLs and environment variables for different environments (dev, staging, prod). For example:

import { defineConfig } from 'cypress';

export default defineConfig({
    e2e: {
      baseUrl: 'https://api.example.com',
      env: {
        apiKey: 'your-api-key',
        environment: 'staging'
      },
      setupNodeEvents(on, config) {
        // event listeners if needed
      }
    }
  })
  

Use fixtures to store expected response bodies or parts of them for comparison.

Test Reporting and CI/CD Integration
  • Use Cypress built-in reporter for test results in the terminal.
  • Integrate with mochawesome reporter for detailed HTML reports.
  • Configure CI pipelines (GitHub Actions, Jenkins, GitLab CI) to run tests on push or pull requests.
  • Fail the build if any assertion on response bodies fails, ensuring API correctness.
Best Practices
  1. Use explicit assertions: Assert specific keys and values in the response body to catch errors early.
  2. Use fixtures for expected data: Keep expected response data in fixtures for easy updates and readability.
  3. Handle asynchronous calls properly: Use Cypress commands chaining and cy.intercept to wait for responses before asserting.
  4. Keep tests independent: Each test should set up its own data or mock responses to avoid flaky tests.
  5. Use descriptive test names: Clearly state what response body aspect is being asserted for easier debugging.
Self Check

Where in this folder structure would you add a new test file to assert the response body of a new API endpoint?

Key Result
Organize Cypress tests with clear folder layers, use fixtures for expected data, and assert response bodies explicitly for reliable API testing.

Practice

(1/5)
1. What is the main purpose of asserting response bodies in Cypress tests?
easy
A. To check if the UI elements are visible on the page
B. To verify the server sends the correct data in the response body
C. To measure the page load time
D. To test the browser compatibility

Solution

  1. Step 1: Understand response body assertion

    Asserting response bodies means checking the data returned by the server is correct and as expected.
  2. Step 2: Identify the purpose in Cypress tests

    Cypress uses assertions on response bodies to confirm the server sends the right data, not UI or performance checks.
  3. Final Answer:

    To verify the server sends the correct data in the response body -> Option B
  4. Quick Check:

    Response body assertion = verify server data [OK]
Hint: Response body assertions check server data, not UI or speed [OK]
Common Mistakes:
  • Confusing response body with UI element checks
  • Thinking it measures performance
  • Assuming it tests browser features
2. Which of the following is the correct syntax to assert that the response body has a property name equal to "John" in Cypress?
easy
A. cy.request('/api/user').expect('body.name').to.equal('John')
B. cy.request('/api/user').body.should('contain', 'name', 'John')
C. cy.request('/api/user').its('body').should('have.property', 'name', 'John')
D. cy.request('/api/user').should('body.name', 'John')

Solution

  1. Step 1: Review Cypress chaining syntax

    In Cypress, cy.request() returns a response object. To assert a property in the body, use its('body') to access it.
  2. Step 2: Use should('have.property', key, value) for assertion

    The correct way to check a property and its value is should('have.property', 'name', 'John').
  3. Final Answer:

    cy.request('/api/user').its('body').should('have.property', 'name', 'John') -> Option C
  4. Quick Check:

    Use its('body').should('have.property', key, value) [OK]
Hint: Use its('body').should('have.property', key, value) for body checks [OK]
Common Mistakes:
  • Trying to access body directly without its()
  • Using expect() incorrectly inside cy.request chain
  • Wrong method names like expect() or body.should()
3. Given the following Cypress code, what will be the result of the assertion?
cy.request('/api/data').then((response) => {
  expect(response.status).to.eq(200)
  expect(response.body.items).to.have.length(3)
})
medium
A. The test passes if the response status is 200 and items array has exactly 3 elements
B. The test fails if the response status is 200 but items array has more than 3 elements
C. The test passes regardless of the items array length
D. The test fails if the response status is not 404

Solution

  1. Step 1: Analyze the status code assertion

    The code expects response.status to equal 200, so the server must respond with HTTP 200.
  2. Step 2: Analyze the items array length assertion

    The code expects response.body.items to have exactly 3 elements. If it has more or less, the test fails.
  3. Final Answer:

    The test passes if the response status is 200 and items array has exactly 3 elements -> Option A
  4. Quick Check:

    Status 200 and items length 3 = pass [OK]
Hint: Both status and body length must match exactly for pass [OK]
Common Mistakes:
  • Ignoring the length check on items array
  • Confusing status 200 with 404
  • Assuming partial matches pass
4. Identify the error in this Cypress test code that asserts the response body property success is true:
cy.request('/api/submit').then((response) => {
  expect(response.body.success).to.be.true()
})
medium
A. The cy.request method is missing a URL
B. The property success does not exist in response.body
C. The then callback should use response.body.success()
D. The assertion should be to.be.true without parentheses

Solution

  1. Step 1: Check the assertion syntax

    In Chai assertions used by Cypress, to.be.true is a property, not a function, so it should not have parentheses.
  2. Step 2: Confirm other parts are correct

    The URL is provided, and accessing response.body.success is valid if the property exists.
  3. Final Answer:

    The assertion should be to.be.true without parentheses -> Option D
  4. Quick Check:

    Use to.be.true without () for boolean assertions [OK]
Hint: Boolean assertions use to.be.true without parentheses [OK]
Common Mistakes:
  • Adding parentheses to boolean assertions
  • Assuming success is a function
  • Missing URL in cy.request
5. You want to assert that the response body contains a nested object with a user's id equal to 5 and a roles array containing "admin". Which Cypress assertion correctly checks both conditions?
hard
A. cy.request('/api/user/5').its('body').should((body) => { expect(body.id).to.eq(5) expect(body.roles).to.include('admin') })
B. cy.request('/api/user/5').should('body.id', 5).and('body.roles', 'admin')
C. cy.request('/api/user/5').then((response) => { expect(response.body.id).to.equal(5) expect(response.body.roles).to.have.length(1) })
D. cy.request('/api/user/5').its('body').should('have.property', 'id', 5).and('have.property', 'roles', 'admin')

Solution

  1. Step 1: Understand nested assertions with callback

    Using should with a callback allows multiple assertions on the body object.
  2. Step 2: Check each assertion correctness

    expect(body.id).to.eq(5) checks the id correctly. expect(body.roles).to.include('admin') checks the roles array contains 'admin'.
  3. Step 3: Identify incorrect options

    cy.request('/api/user/5').should('body.id', 5).and('body.roles', 'admin') uses invalid chaining syntax. cy.request('/api/user/5').then((response) => { expect(response.body.id).to.equal(5) expect(response.body.roles).to.have.length(1) }) misses checking 'admin' in roles. cy.request('/api/user/5').its('body').should('have.property', 'id', 5).and('have.property', 'roles', 'admin') wrongly checks roles as a property equal to string 'admin'.
  4. Final Answer:

    cy.request('/api/user/5').its('body').should((body) => { expect(body.id).to.eq(5) expect(body.roles).to.include('admin') }) -> Option A
  5. Quick Check:

    Use callback in should for multiple nested assertions [OK]
Hint: Use should callback for multiple nested property checks [OK]
Common Mistakes:
  • Trying to chain multiple properties incorrectly
  • Checking array length instead of content
  • Using have.property with array content as string
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