Cypress: изменение кода во время работы приводит к сбою моих тестов (запрос отменен) - PullRequest
0 голосов
/ 25 февраля 2020

Я тестирую приложение Angular с Cypress.

Я запускаю тест с панелью Cypress, которую я открываю с помощью этой команды: $(npm bin)/cypress open

I ' Я вызываю API с моим тестом: он работает .

Но когда я изменяю свой код, Cypress перезапустит код, что приведет к сбою моего первого (и только моего первого теста). Запрос вызова API отменен.

Единственный способ заставить его работать снова - это вручную завершить процесс, а затем запустить его снова.

Кто-нибудь получил Идея, что вызывает это странное поведение?

Вот мой тестовый код:

  beforeEach(() => {
        cy.visit('/');
        cy.server();
        cy.route('POST', `myUrl`).as('apiCall');
    });

    it('should find a doctor when user searches doctor with firstName', () => {
        cy.get('#myInput').type('foo');
        cy.get('#submitButton]').click();
        cy.wait('@apiCall').then((xhr) => {
            expect(xhr.status).to.eq(200); 
        });
    });

1 Ответ

0 голосов
/ 25 февраля 2020

Вы можете подготовить заглушку XHR следующим образом:

describe('', () => {
  let requests = {}; // for store sent request

  beforeEach(() => {
    cy.server({ delay: 500 }); // cypress will answer for mocked xhr after 0.5s
    cy.route({
      url: '<URL>',
      method: 'POST',
      response: 'fixture:response',
      onRequest: ({ request }) => {
        Object.assign(requests, { someRequest: request.body }); // it has to be mutated
      },
    });
  });

И затем в тесте:

it('', () => {
  cy
    .doSomeSteps()
    .assertEqual(requests, 'someRequest', { data: 42 })
});

У этого решения есть 2 преимущества: первая задержка 0,5 с делает тест более реалистичным c потому что настоящий бэкэнд не отвечает сразу. Во-вторых, вы можете проверить, будет ли приложение отправлять полезную нагрузку после шага doSomeActions().

assertEqual просто используется, чтобы сделать утверждение более читабельным

Cypress.Commands.add('assertEqual', (obj, key, value) =>
  cy
    .wrap(obj)
    .its(key)
    .should('deep.equal', value)
);
...