Bird
Raised Fist0
Cypresstesting~5 mins

Asserting response bodies in Cypress

Choose your learning style10 modes available
Introduction

We check response bodies to make sure the server sends the right data. This helps catch mistakes early.

When testing if an API returns the expected user details after login.
When verifying that a product list API returns the correct items.
When checking if a form submission returns a success message in the response.
When confirming that error messages appear correctly in the response body.
When validating that data updates are reflected in the API response.
Syntax
Cypress
cy.request('GET', '/api/data').then((response) => {
  expect(response.body).to.have.property('key', 'value')
})

Use cy.request() to make API calls in Cypress.

Use expect() to check the response body content.

Examples
Checks that the user with ID 1 has the name 'Alice'.
Cypress
cy.request('GET', '/users/1').then((response) => {
  expect(response.body).to.have.property('name', 'Alice')
})
Checks that the login response includes a token property.
Cypress
cy.request('POST', '/login', { username: 'bob', password: '1234' }).then((response) => {
  expect(response.body).to.have.property('token')
})
Checks that the products response is an array and the first item has an id.
Cypress
cy.request('GET', '/products').then((response) => {
  expect(response.body).to.be.an('array')
  expect(response.body[0]).to.have.property('id')
})
Sample Program

This test sends a GET request to '/users/2' and checks the status code is 200. Then it asserts the response body has the correct user id and email.

Cypress
describe('API response body test', () => {
  it('checks user data in response body', () => {
    cy.request('GET', '/users/2').then((response) => {
      expect(response.status).to.eq(200)
      expect(response.body).to.have.property('id', 2)
      expect(response.body).to.have.property('email', 'user2@example.com')
    })
  })
})
OutputSuccess
Important Notes

Always check the response status code before asserting the body.

Use clear property names to avoid confusion in assertions.

Response bodies can be objects or arrays; adjust assertions accordingly.

Summary

Asserting response bodies helps verify the server sends correct data.

Use cy.request() and expect() to check response content.

Check status codes first, then assert body properties carefully.

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