Cypress - 从 json 响应体中获取值

Zac*_*low 3 javascript web-api-testing cypress

我正在使用 Cypress 进行一些 API 测试,但我很难访问 JSON 响应正文中的值;但是我可以对身体进行断言,这表明它正确地接收了它。

下面我试图分配 JSON 正文(response.body),然后从中获取 'id' 的值:

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']
    })
})
Run Code Online (Sandbox Code Playgroud)

我已经做了很多搜索,但找不到具体的方法来做到这一点。任何帮助,将不胜感激...

Zac*_*low 6

我设法通过使用 Promise 解决了这个问题;

进一步阅读后,我发现then我正在执行的函数是同步的(我是 JS 新手,请不要伤害我)。

我将then函数重构为以下内容:

.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)
        })
Run Code Online (Sandbox Code Playgroud)

这可能不完全正确或最佳实践,但它适用于我的演示


Dur*_*tko 6

尽管由于您找到了解决方法而不再需要,但我已经研究了我的赛普拉斯代码。我能够通过以下方式访问响应正文的属性:

cy.request({
    ...
    }).its('body').then((body) => {
    const whatever = body.whatever;
})
Run Code Online (Sandbox Code Playgroud)

我相信它的工作原理基本上与您的解决方法相同 - 等待在承诺中解析主体。