Cypress: Возвращение значения в обещании в пользовательской команде? - PullRequest
1 голос
/ 03 февраля 2020

Поэтому я пытаюсь использовать пользовательскую команду, чтобы уменьшить необходимость записывать одно и то же в несколько файлов. В частности, это для входа в систему и установки токена через JWT.

Вот текущий рабочий код (заимствованный из примера входа в JWT из примеров кипариса):

let user;
before(function() {
  cy.request("POST", Cypress.env("auth_url"), {
    username: Cypress.env("auth_username"),
    password: Cypress.env("auth_password")
  })
    .its("body")
    .then(res => {
      user = res;
    });
});
beforeEach(function() {
  console.log(cy.get_auth_token)
  cy.visit("/", {
    onBeforeLoad(win) {
      // set the user object in local storage
      win.localStorage.setItem("token", user.token);
    }
  });
});

Итак, я попытался сделать что-то похожее через:

Cypress.Commands.add("get_auth_token", () => {
    let user;
    cy.request("POST", Cypress.env("auth_url"), {
        username: Cypress.env("auth_username"),
        password: Cypress.env("auth_password")
      })
        .its("body")
        .then(res => {
          user = res;
        });
    return user;

})

Однако, когда я пытаюсь вызвать его в моей beforeEach функции как let user = cy.get_auth_token, я получаю ошибки о том, что пользователь не определен. Я делаю что-то не так с возвратом значения? Я не эксперт по обещаниям ... но такое чувство, что оно должно работать?

Спасибо!

Ответы [ 2 ]

1 голос
/ 03 февраля 2020

Команды не похожи на функции, возвращаемое значение не присваивается локальной переменной. Вместо этого они «передают» его следующей команде в цепочке, которая может быть then(). Кроме того, значение является «субъектом», который представляет собой * * вернутую версию возвращаемого значения.

Короче говоря, именно так вы и должны использовать свою пользовательскую команду:

beforeEach(function() {
  cy.get_auth_token().then($user => {
    console.log($user[0]);
    cy.visit("/", {
      onBeforeLoad(win) {
        // set the user object in local storage
        win.localStorage.setItem("token", $user[0].token);
      }
    });
  });
});
1 голос
/ 03 февраля 2020

Постарайтесь поместить свой код в Promise и разрешите «user». Используя Cypress.Promise , он будет ждать возвращения пользователя:

Cypress.Commands.add("get_auth_token", () => {
  return new Cypress.Promise((resolve, reject) => {

     cy.request("POST", Cypress.env("auth_url"), {
        username: Cypress.env("auth_username"),
        password: Cypress.env("auth_password")
      })
        .its("body")
        .then(user => {
          resolve(user);
      });        
  })

})
...