Можно ли запускать команды cy.writeFile или cy.readFile как часть действия cy.route? - PullRequest
0 голосов
/ 23 декабря 2019

В настоящее время я пытаюсь смоделировать шаблон ответа клиент-сервер с помощью Cypress.

Я хотел бы:

  1. Использовать cy.route для перехвата вызова, чтобы установить данные, когдаЯ нажимаю кнопку «Сохранить»
  2. Запишите ответ в файл, используя параметр onResponse моего cy.route
  3. Используйте содержимое файла как мой ответ на тот же вызов cy.route

В настоящее время, если я включаю команду cy.writeFile или даже команду console.log (cy.readFile (testFile)), я получаю сообщение об ошибке при вызове маршрута с помощью cy.wait.

Ошибка:

application_actions.js:84 Uncaught (in promise) TypeError: Cannot read property 'statusText' of undefined

Если я удаляю cy.writeFile или readFile из моего блока onResponse, код выполняется нормально.

Вот пример того, что я делаю:

beforeEach(() => {
      //call fixture file 
      cy.fixture('newApplication.json').as('newApplication')
      cy.server()
      //This first route is used when I load a page that contains application data. 
      //This works fine
      cy.route('GET', 'applications/*', '@newApplication').as('getNewApplication')
      //This route is hit when I click a Save Button to save updates to my application data
      cy.route({
        method: 'PATCH', 
        url: 'applications/update/*',
        onRequest: (xhr) => {
          cy.writeFile('cypress/fixtures/newApplication.json', xhr.request.body.application)
          },
        response: '@newApplication'
      })
      .as('updatedApplication')
      cy.visit('/admin/review_application/1')
      cy.wait('@getNewApplication')
      .its('response.headers')
      .its('content-type')
      .should('contain','application/json')
    });

it.only('Saving Restaurant Name changes page header text', () => {
      //Alter some application data
      cy.get('#Restaurant\\ Name')
        .clear()
        .type('Header Update Test');
      cy.get('#name-buttons\\ Accept').click();
      //Click save button to save data change
      clickSaveButton();
      //hit updatedApplication route when data is saved
      cy.wait('@updatedApplication').should('have.property','status',200)
      //Test fails on above wait every time
      cy.reload();
      cy.wait('@getNewApplication')
      cy.get('#Restaurant\\ Name').then($newText => {
          //compare text values to ensure the data change was saved
          cy.get('.MuiTypography-h2').then($headerText => {
          expect($headerText).to.have.text($newText.prop('value'));
        });
      });

Кажется, что cy.route полностью синхронен, поэтому, возможно, это невозможно, или, возможно, я делаю что-то не так.

Любая помощь будет признательна!

Ответы [ 2 ]

0 голосов
/ 23 декабря 2019

Мне не удалось заставить кипарис записать в тот же файл фикстуры, а затем прочитать обратно измененные данные. Даже если я добавил второй вызов cy.fixure, чтобы попытаться извлечь измененный файл.

Вместо этого я закончил записывать в новый файл, а затем настраивал новые маршруты для его чтения.

clickSaveButton(); cy.wait('@updatedApplication').then((xhr) => { cy.writeFile('cypress/fixtures/updatedApplication.json', xhr.request.body.application).then(() => { cy.fixture('updatedApplication.json').as('updatedApplication') cy.route('GET', 'applications/*', '@updatedApplication').as('getUpdatedApplication') }) }) cy.reload() cy.wait('@getUpdatedApplication')

Спасибо за помощь, приведи меня сюда!

0 голосов
/ 23 декабря 2019

Я думаю, что вы на правильном пути, просто обновите второй вызов слишком рано. Я хотел бы предложить вам попробовать что-то вроде:

  1. Удалите обновление маршрута из вашего beforeEach блока
  2. Используйте cy.wait и добавьте его после ваше действие клика, например:

cy.wait('@getNewApplication').then((xhr) => {
  cy.writeFile('cypress/fixtures/newApplication.json', xhr.request.body.application)
  cy.route({
   method: 'PATCH',
   url: 'applications/update/*',
   response: '@getNewApplication'
 }).as('updatedApplication');
})

У меня сработало нормально в моем проекте.

Совет: Если это сработает, вы можете извлечь обновление для метода, чтобы лучшеудобочитаемость.

...