Запрос cypress: пустой массив в теле

У меня возникли проблемы при тестировании моего API с помощью Cypress. (Я использую версию 2.1.0)

Я отправляю запрос на свою конечную точку и хочу проверить, как она реагирует, когда я отправляю пустой массив в качестве параметра. Проблема в том, что каким-то образом Cypress должен разбирать тело, которое я ему даю, и удалять пустой массив.

Мой код следующий:

cy.request({
    method: 'PUT',
    url,
    form: true,
    body: {
        name: 'Name',
        subjects: []
    }
})
.then((response) => {
    expect(response.body).to.have.property('subjects');
    const { subjects } = response.body;
    expect(subjects.length).to.eq(0);
});

// API receives only the parameter name, and no subjects

Когда я отправляю пустой массив субъектов, конечная точка удаляет все связанные субъекты и возвращает объект с пустым массивом субъектов. Он работает так, как должен, и мое используемое программное обеспечение работает так, как должно.

Когда Cypress отправляет этот запрос, конечная точка не получает параметр предметы. Для меня это совсем другое: я не должен трогать предметы в этом случае.

Есть ли способ избежать этой "перезаписи" Cypress и отправить тело так, как я его пишу?

В качестве быстрой проверки работоспособности, если вы перейдете на вкладку сети в Chrome после запуска этого теста, будет ли сгенерированный запрос содержать subjects: []?

Joshua Wade 10.08.2018 15:29

Нет, проблема именно в этом, содержание отправленного тела только name = Name

hellimac 10.08.2018 16:10

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

Joshua Wade 10.08.2018 16:31
4
3
2 932
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Тест работает при установке form: false.

it.only('PUTs a request', () => {
  const url = 'http://localhost:3000/mythings/2'
  cy.request({
      method: 'PUT',
      url: url,
      form: false,
      body: {
        name: 'Name',
        subjects: []
      }
    })
    .then((response) => {
      expect(response.body).to.have.property('subjects');
      const {
        subjects
      } = response.body;
      expect(subjects.length).to.eq(0);
    });
})

Я установил локальный сервер отдыха с json-сервер, чтобы проверить поведение.

Если я попытаюсь ПОСТАВИТЬ непустой массив с помощью form: true

cy.request({
    method: 'PUT',
    url: url,
    form: true,
    body: {
      name: 'Name',
      subjects: ['x']
    }
  })

глядя на db.json после запуска теста, я вижу, что индекс элемента мигрирует в ключ,

"mythings": [
    {
        "name": "Name",
        "subjects[0]": "x",
        "id": 2
    }
],

так что, возможно, form означает только простые свойства.

Переход на form: false дает правильный массив

{
  "mythings": [
    {
      "name": "Name",
      "subjects": ['x'],
      "id": 2
    }
  ],
}

который затем можно очистить, отправив пустой массив.

Действительно работает! Я не понимал, но если поставить form: true, тело не будет отправлено как JSON, и из-за этого у вас не может быть пустого массива в качестве аргумента.

hellimac 12.08.2018 12:44

Помогло мне понять, что мне нужна форма, чтобы быть правдой.

dudeNumber4 28.11.2018 15:25

Другие вопросы по теме