最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Cypress - get value from json response body - Stack Overflow

programmeradmin2浏览0评论

I'm using Cypress to do some API testing, but I am struggling to access values in the JSON response body; however I can perform assertions against the body which suggests it's receiving it correctly.

Below I am trying to assign the JSON body (response.body) and then get the value of 'id' out of it:

describe('Creating a board', () => {    
it('should create a board', () => {
    cy.request({
    method : 'POST',
    url:`${requestUrl}/boards/`, 
    qs: {
      name : "test-board",
      token : token,
      key : key
    }
    }).then((response) => {
      expect(response).property('status').to.equal(200)
      expect(response.body).property('id').to.not.be.oneOf([null, ""])
      const body = (response.body)
      boardId = body['id']
    })
})

I've done numerous searches and can't find a concrete way to do it. Any help would be appreciated...

I'm using Cypress to do some API testing, but I am struggling to access values in the JSON response body; however I can perform assertions against the body which suggests it's receiving it correctly.

Below I am trying to assign the JSON body (response.body) and then get the value of 'id' out of it:

describe('Creating a board', () => {    
it('should create a board', () => {
    cy.request({
    method : 'POST',
    url:`${requestUrl}/boards/`, 
    qs: {
      name : "test-board",
      token : token,
      key : key
    }
    }).then((response) => {
      expect(response).property('status').to.equal(200)
      expect(response.body).property('id').to.not.be.oneOf([null, ""])
      const body = (response.body)
      boardId = body['id']
    })
})

I've done numerous searches and can't find a concrete way to do it. Any help would be appreciated...

Share Improve this question asked Feb 2, 2020 at 22:34 ZachOverflowZachOverflow 4571 gold badge6 silver badges16 bronze badges
Add a comment  | 

3 Answers 3

Reset to default 9

I managed to solve this by using a Promise;

Doing some further reading, I found out the then function I am executing is synchronous (I'm new to JS, pls don't hurt me).

I refactored the then function to the following:

.then((response) => {
        return new Promise(resolve => {        
            expect(response).property('status').to.equal(200)
            expect(response.body).property('id').to.not.be.oneOf([null, ""])
            const respBody = response.body;
            boardId = respBody['id']
            resolve(boardId)
        })

It's probably not entirely correct or best practice, but it will do for my demo

Although not needed anymore as you found a workaround, I've looked into my cypress code. I was able to access properties of response body followingly:

cy.request({
    ...
    }).its('body').then((body) => {
    const whatever = body.whatever;
})

I believe it basically works the same as your workaround - waiting to resolve body in a promise.

I was able to do it in the following way:

cy.request(
        'POST',
        url,
        payload()).then((response) => {
            expect(response.body).to.have.property('ReturnCode', 'Success')
            expect(response.body).to.have.property('ReturnText', 'Success')
            expect(response.body).to.have.property('PaymentInstructionId')
            paymentID = response.body.PaymentInstructionId
        })

paymentID is the variable that is filled with the value that i want from the repply.

发布评论

评论列表(0)

  1. 暂无评论