Cypress запускает cy.wait (1000) дважды в отдельных тестах - PullRequest
4 голосов
/ 13 января 2020

В моих Angular тестах Cypress E2E у меня есть небольшой грязный сценарий, который я хочу проверить: заполните регистрационную форму (localhost) и отправьте ее, затем go в (поддельный) почтовый ящик и соберите подтверждение Электронное письмо. Поскольку FakeSMTP требуется некоторое время, я хочу подождать, прежде чем получить к нему доступ

it('should submit the registration', () => {
  cy.visit('https://localhost/register);
  ...
  cy.get('button[type=submit]').should('not.be.disabled').click();
});

// Collect the Mail
it('should collect the registration activation email', () => {

  /**
   * Wait 10 Seconds for E-Mail to arrive
   */
  cy.wait(10000); // --> this fires twice

  cy.visit('https://localhost:5080');
  ...
});

Почему cy.wait(10000) срабатывает дважды? Первый раз при отправке (самое последнее), второй раз, когда он действительно должен быть в коллекции электронной почты.

Ответы [ 2 ]

2 голосов
/ 15 января 2020

Я думаю, что Cypress сбрасывает второй тест при обнаружении нового домена, см. Этот комментарий Изменение baseUrl во время теста

Cypress меняет родительский домен в соответствии с baseUrl, во избежание проблем с навигацией по сайту, который не соответствует родительскому домену. Продукт Cypress просто не кодируется, чтобы справиться с изменением середины теста baseUrl.

Чтобы проверить это, этот простой тест отражает то, что происходит

describe('changing domains', () => {

  it('goes to example.com', () => {
    cy.visit('http://example.com')
  })

  it('changes to example.net', () => {
    cy.wait(10000)
    cy.visit('http://example.net')
  })
})

Есть несколько способов (потенциально) избежать этой проблемы, но не уверен, что любой из них будет работать для вас.

  1. Go для нового домена в начале второго теста с фиктивным вызовом,
describe('changing domains', () => {

  it('goes to example.com', () => {
    cy.visit('http://example.com')
  })

  it('changes to example.net', () => {
    cy.visit('http://example.net')
    cy.wait(10000)
    cy.visit('http://example.net')
  })
})
Подождите в первом тесте,
describe('changing domains', () => {

  it('goes to example.com', () => {
    cy.visit('http://example.com')
    cy.wait(10000)
  })

  it('changes to example.net', () => {
    cy.visit('http://example.net')
  })
})

Идеальным решением было бы исключить сервер FakeSMTP из теста и перехватить отправленную почту таким же образом, как и сообщения XHR пойманный в ловушку и заглушенный cy.route(), тогда вам не придется ждать 10 секунд, но я не вижу примеров, поэтому предположим, что это пока невозможно. Возможно, это произойдет, когда придут собственные события.


Я посмотрел этот пост Тестирование рабочего процесса электронной почты от конца до конца с помощью Cypress , который создает пользовательскую команду для опроса сервер, пока электронная почта не включается, используя рекурсию. По сути, он действует как повторение команды cypress, поэтому вы не ждете произвольное время (как говорит @Jboucly, его следует избегать), но ждете с шагом 300 мс, пока не придет электронное письмо.

Cypress.Commands.add('getLastEmail', email => {
  function requestEmail() {
    return cy
      .request({
        method: 'GET',
        url: 'http://localhost:4003/last-email',
        headers: {
          'content-type': 'application/json',
        },
        qs: {
          email,
        },
        json: true,
      })
      .then(({ body }) => {
        if (body) {
          return body;
        }

        // If body is null, it means that no email was fetched for this address.
        // We call requestEmail recursively until an email is fetched.
        // We also wait for 300ms between each call to avoid spamming our server with requests
        cy.wait(300);

        return requestEmail();
      });
  }

  return requestEmail();
});

Это действительно должно иметь предел глубины рекурсии, в случае, если все не go, как ожидалось, и электронное письмо не приходит.

0 голосов
/ 14 января 2020

Попробуйте: :)

cy.visit('http=//localhost:5080').wait(10000);

A cy.wait () Сам по себе кипарис не очень рекомендуется. здесь

В do c , уважать хорошую практику (если возможно с вашими почтовыми утилитами) - это использовать его API для получения почты, а не делать это через интерфейс

...