赛普拉斯将响应正文中的内容另存为别名或变量

时间:2018-12-10 07:23:27

标签: cypress

我使用cy.request创建一个新用户。我需要获取userID并使用它来组合一个URL。

例如:

function createUser () {
  cy.request({
    method: 'GET',
    url: `/human/sign_in`
  }).then(response => {
    const $ = cheerio.load(response.body)
    const token = $('css to get the token')
    cy.request({
      method: 'POST',
      url: `/signups/brands`,
      form: true,
      body: {
        'authenticity_token': token,
        'name': 'some name',
        'email': 'some email'
      }
    })
  }).then(response => {
    const $ = cheerio.load(response.body)
    const userID = $('css to get userID') // here's the userID
  })
}

如何返回此userID,以及如何在以下代码中引用它?

describe('some feature', () => {
  it('should do something', () => {
    createUser()
    cy.visit(`/account/${userID}`)      // how to refer to it?
  })
})

我查阅了正式文件。 as()似乎可以起到一些作用。但是我找不到在as()之后使用cy.request()的示例。

谢谢!

2 个答案:

答案 0 :(得分:1)

我们在测试中使用custom command做同样的事情,并从那里返回值。带有返回值的自定义命令将自动等待返回值,因此您不必担心异步问题或别名的麻烦。

Cypress.Commands.add("createUser", () {
  return cy.request({
    method: 'GET',
    url: `/human/sign_in`
  }).then(response => {
    const $ = cheerio.load(response.body)
    const token = $('css to get the token')
    cy.request({
      method: 'POST',
      url: `/signups/brands`,
      form: true,
      body: {
        'authenticity_token': token,
        'name': 'some name',
        'email': 'some email'
      }
    })
  }).then(response => {
    const $ = cheerio.load(response.body)
    return $('css to get userID') // here's the userID
  })
})

然后您的测试将如下所示:

describe('some feature', () => {
  it('should do something', () => {
    cy.createUser().then(userId => {
      cy.visit(`/account/${userID}`)
    })
  })
})

答案 1 :(得分:1)

我认为最简单的方法是在函数中添加一些return语句,并在测试中使用then()。 (感谢@soccerway提出的建议)

function createUser () {
  return cy.request({
    method: 'GET',
    url: `/human/sign_in`
  }).then(response => {
    const $ = cheerio.load(response.body)
    const token = $('css to get the token')
    cy.request({
      method: 'POST',
      url: `/signups/brands`,
      form: true,
      body: {
        'authenticity_token': token,
        'name': 'some name',
        'email': 'some email'
      }
    })
  }).then(response => {
    const $ = cheerio.load(response.body)
    const userID = $('css to get userID') // here's the userID
    return userID;
  })
}

describe('some feature', () => {
  it('should do something', () => {
    createUser().then(userID => {
      cy.visit(`/account/${userID}`)
    })
  })
})