如何在Promise的then()块之外使用赛普拉斯的夹具数据

时间:2018-09-12 19:36:42

标签: automated-tests cypress

我正在测试赛普拉斯,并且我有custom Cypress command的以下代码:

Cypress.Commands.add('login', (user, password) => {
  if (!user || !password) {
    user = 'user@test.com.br';
    password = '123321';
  }

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

如果不带任何参数调用cy.login(),则会在user块内分配passwordif。否则,它将使用传递的参数值。

我试图在此处添加灯具,并想出了以下代码:

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时,它的值刚好在.then内部, 所以我创建了函数登录名来解决该问题。

我想有一种更好的方法可以做到这一点。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

Cypress文档提供了使用Return Values的指南。最值得注意的是,它提出以下建议:

  

返回值

     

您不能分配或使用任何赛普拉斯命令的返回值。命令已排队并异步运行。

然后,文档继续说明Closures的用法,并在.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();
    });
});

作为参考, default-user.js 如下所示:

{
  username: 'user@test.com.br',
  password: '123321'
}

successful test run image

AliasesSharing Context上的赛普拉斯文档有助于理解在不同赛普拉斯上下文和用例中引用值的细微差别。