Как мы можем игнорировать значение openHash в отправке запроса cy.route()

#javascript #cypress #cypress-cucumber-preprocessor

#javascript #кипарис #cypress-cucumber-препроцессор

Вопрос:

В Cypress я использую cy.route() для отправки запроса ниже, но cypress не идентифицирует отправку запроса ниже. В URL-адресе маршрута есть значение openHash, которое будет отличаться для каждого запроса POST. Есть ли какой-нибудь способ проигнорировать значение openHash или принять любое значение, отображаемое там.

До сих пор я пытался указать URL-адрес следующими способами в маршруте.

  url: '**/student/details.php?viewDetails=projectamp;stdCount=1amp;sectionID=1amp;openHash=**',
 url: '**/student/details.php?viewDetails=projectamp;stdCount=1amp;sectionID=1amp;openHash=**amp;ajaxCall=true**',
 

Я считаю, что при использовании cy.route() URL-адрес публикации должен точно совпадать. Не мог бы кто-нибудь посоветовать, пожалуйста

Cypress version: 5.4.0

Student.feature

 Feature: Update student details

Background: User logged in to application
        Given I should load all of the routes required for tests

Scenario: Update student details
        When I am logged in as the student user
        And I click on "Student" subtab
        And I should see details displayed
 

Step definition :

 import { Then, When, And } from "cypress-cucumber-preprocessor/steps";

before(() => {
  Then('I should load all of the routes required for tests', () => {
        cy.server();
        cy.route({
           method: 'POST',
           url: '**student/details.php?viewDetails=projectamp;stdCount=1amp;sectionID=1amp;openHash=5fc8329a76e73amp;ajaxCall=true**',
           delay: 2000
        }).as('getStudentTabDetails');
    })
})   


Then('I am logged in as the student user', () => {
  cy.get('[name=loginUsername]').type("Student1");
  cy.get('[name=loginPassword]').type("somePassword1", { sensitive: true });
  cy.contains('Login').click();
})


Then('I click on {string} subtab', (student) => {
  cy.get('#main a').contains(student).click({force:true});
});
  
Then('I should see details displayed', () => {
  cy.wait('@getStudentTabDetails', { timeout: 5000 });
});
    
 

Error:
Ошибка кипариса
Тайм-аут повторной попытки: cy.wait() тайм-аут ожидания 5000 мс для 1-го запроса к маршруту: getStudentTabDetails. Никакого запроса так и не поступило.

Комментарии:

1. Я думаю, что в cy.route2 есть pathname опция — совпадения типа ‘path’, но без параметров запроса , поэтому следует игнорировать все после ‘?’.

2. @Ackroydd Я добавил к вопросу шаг функции и строку определения шага. При нажатии на вкладку Student приложение отправит запрос POST. Я пытаюсь перехватить этот запрос, используя строку I should see details displayed

3. Спасибо, теперь все ясно. cy.route() требуется cy.server() перед ним, так что это первый шаг. cy.route2() лучше для вашего требования.

4. Я использую cy.server() в своем тесте. Попробую с помощью cy.route2()

5. Пожалуйста, предоставьте полный тест в вопросе, иначе трудно помочь.

Ответ №1:

Cypress.minimatch — это инструмент, который можно использовать для проверки совпадений маршрутов.

По умолчанию Cypress использует minimatch для проверки шаблонов глобусов на соответствие URL-адресам запросов.

Если вы затрудняетесь с написанием правильного шаблона, вы можете выполнить итерацию намного быстрее, протестировав ее непосредственно в консоли инструментов разработчика.

Два маршрута, которые вы показываете в вопросе, на самом деле проходят тест на минимальное соответствие.

 const url = 'http://example/student/details.php?viewDetails=projectamp;stdCount=1amp;sectionID=1amp;openHash=5fc8329a76e73amp;ajaxCall=true';

const pattern1 = '**/student/details.php?viewDetails=projectamp;stdCount=1amp;sectionID=1amp;openHash=**';
console.log( Cypress.minimatch(url, pattern1) );  // true

const pattern2 = '**/student/details.php?viewDetails=projectamp;stdCount=1amp;sectionID=1amp;openHash=**amp;ajaxCall=true**';
console.log( Cypress.minimatch(url, pattern2) );  // true
 

Вот Cypress fiddle, который показывает, как использовать новый метод перехвата для обработки параметров запроса.

 /// <reference types="@cypress/fiddle" />

const test = {
  html: `
    <p class="text-lg"></p>
    <script>
      setTimeout(() => {
        const url = 'http://example/student/details.php?viewDetails=projectamp;stdCount=1amp;sectionID=1amp;openHash=5fc8329a76e73amp;ajaxCall=true';
        window.fetch(url, { method: 'POST'});
      }, 1000);
    </script>
  `,
  test: `
  cy.intercept({
    method: 'POST',
    url: '/student/details.php',
    query: {
      viewDetails: 'project',   // whatever query parts you care about
      stdCount: '1',
      sectionID: '1'
    }
  }, {})                 // Added an empty stub here, as my url does not actually exist
  .as('getStudentTabDetails');
  cy.wait('@getStudentTabDetails')
  `
}

it('', () => {
  cy.runExample(test)
});
 

Сообщение создается с помощью встроенной функции fetch(), которая не была бы захвачена в старом cy.route() методе без использования полизаполнения.