Automated tests 如何在promise之外使用Cypress夹具数据';s then()块

Automated tests 如何在promise之外使用Cypress夹具数据';s then()块,automated-tests,cypress,Automated Tests,Cypress,我正在测试Cypress,我有以下代码: 如果在没有任何参数的情况下调用cy.login(),则user和password将在If块中分配。否则,它将使用传递的参数值 我尝试在此处添加装置,并得出以下代码: Cypress.Commands.add('login', (user, password) => { if (!user || !password) { cy.fixture('users').then((json) => { var user, p

我正在测试Cypress,我有以下代码:

如果在没有任何参数的情况下调用
cy.login()
,则
user
password
将在
If
块中分配。否则,它将使用传递的参数值

我尝试在此处添加装置,并得出以下代码:

Cypress.Commands.add('login', (user, password) => {

  if (!user || !password) {

    cy.fixture('users').then((json) => {
      var user, password;

      user = json[0].email;
      password = json[0].password;

      login2(user,password);
    });

  } else {

    login2(user, password);

  }

  function login2(user, password) {

    cy.visit('');
    cy.contains('Entrar').click();
    cy.get('input[name=_username]')
      .type(user);
    cy.get('input[name=_password]')
      .type(password);
    cy.get('.btn').click();

  }
});
当我设置
user=json[0]。email
时,它的值正好在
中。然后,
所以我创建了login函数来解决这个问题


我想有更好的办法。有什么想法吗?

Cypress文档提供了使用的指导。最值得注意的是,它建议如下:

返回值

不能指定或使用任何Cypress命令的返回值。命令排队并异步运行

文档接着解释了
.then()
块中命令的使用和嵌套。利用cypress/support/commands.js中的这种方法,您可以像这样简化代码:

Cypress.Commands.add("login", (user, pw) => {
  let username;
  let password;

  cy.fixture('default-user') // <-- fixture in a separate file, default-user.js
    .then((defaultUser) => {
      username = user || defaultUser.username;
      password = pw || defaultUser.password;

      cy.get('input[name=_username]').type(username);
      cy.get('input[name=_password]').type(password);

      cy.get('.btn').click();
    });
});
{
  username: 'user@test.com.br',
  password: '123321'
}


和上的Cypress文档有助于理解不同Cypress上下文和用例中引用值的细微差别。

请向我们展示您使用login2的代码,否则很难提供任何意见,login2是最后一个函数,mistype
{
  username: 'user@test.com.br',
  password: '123321'
}