Как использовать данные фикстуры Cypress вне блока then () обещания - PullRequest
0 голосов
/ 12 сентября 2018

Я тестирую Cypress, и у меня есть этот код для пользовательской команды Cypress :

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 и 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, он имеет значение простовнутри .then, поэтому я создал функцию входа в систему, чтобы исправить это.

Я думаю, что есть лучший способ сделать это.Есть идеи?

1 Ответ

0 голосов
/ 09 января 2019

Документация 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();
    });
});

Для справки default-user.js выглядит так:

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

successful test run image

Документация Cypress по Псевдонимы и Контекст общего доступа полезна для понимания нюансов ссылок на значения в различных контекстах Cypress и в вариантах использования.

...