Cypress разделяет переменные / псевдонимы между Hooks? - PullRequest
1 голос
/ 05 февраля 2020
So I have a pretty `before` and `beforeEach` function that runs before all tests. It looks something like this:

describe("JWT Authentication", function() {
  before(function() {
    // custom command runs once to get token for JWT auth
    // alias token as 'user' for further use
    cy.get_auth_token().as('user')
  })
  beforeEach(function() {
    // before each page load, set the JWT to the aliased 'user' token
    cy.visit("/", {
      onBeforeLoad(win) {
        // set the user object in local storage
        win.localStorage.setItem("token", this.user.token);
      }
    })
  })
  it("a single test...", function() {
   //do stuff
});

Пользовательская команда также довольно проста:

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

Сама пользовательская команда работает и извлекает токен, как и ожидалось. Однако когда дело доходит до beforeEach, он понятия не имеет, что такое this.user.token. В частности, не зная, что такое user.

Одна опция, конечно, вызывает команду в каждом beforeEach, что и делает рецепт / пример JWT Cypress spe c. Однако это кажется чрезмерным, потому что в моем случае мне НЕ НУЖНО захватывать токен каждый тест. Мне нужно только один раз получить его для этого набора тестов.

Так как я могу поделиться токеном с хуком beforeEach с помощью пользовательской команды Cypress.

1 Ответ

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

Я провел несколько тестов, кажется, что все биты работают!

Следующее не дает вам ответа, но может помочь вам в отладке.

Передача токена между ранее () и beforeEach ()

Предположим, у нас есть пользователь в before(), он получает ответный вызов onBeforeLoad()?

describe("JWT Authentication", function() {

  before(function() {
    const mockUser = { token: 'xyz' }; 
    cy.wrap(mockUser).as('user');
  })

  beforeEach(function() {
    cy.visit("http://example.com", {
      onBeforeLoad(win) {
        console.log(this.user.title);  // prints 'xyz'
      }
    })
  })
  it("a single test...", function() {
   //do stuff
  })
});

Является ли пользовательский команда работает

Я не могу найти макет c для проверки подлинности, но любой cy.request(), который получает объект, должен быть эквивалентным.

Я нажимаю на typicode.com и ищу свойство заголовка

describe("JWT Authentication", function() {

  Cypress.Commands.add("get_auth_token", () => {
    cy.request("GET", 'https://jsonplaceholder.typicode.com/todos/1')
      .its("body")
      .then(body => {
         console.log('body', body); // prints {userId: 1, id: 1, title: "delectus aut autem", completed: false}
         return body;
       });
  })

  before(function() {
    cy.get_auth_token()
      .then(user => console.log('user', user)) // prints {userId: 1, id: 1, title: "delectus aut autem", completed: false}
      .as('user')
  })

  beforeEach(function() {
    cy.visit("http://example.com", {
      onBeforeLoad(win) {
        console.log(this.user.title);  // prints 'delectus aut autem'
      }
    })
  })
  it("a single test...", function() {
   //do stuff
  })
});

Пользовательская команда

Эта более короткая версия также работает

Cypress.Commands.add("get_auth_token", () => {
  cy.request("GET", 'https://jsonplaceholder.typicode.com/todos/1')
    .its("body");
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...