У меня возникли проблемы при тестировании моего 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 и отправить тело так, как я его пишу?
Нет, проблема именно в этом, содержание отправленного тела только name = Name
Это звучит как что-то, что можно считать ошибкой или, по крайней мере, неожиданным поведением. Я бы посоветовал отправив это как ошибку в Github.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Тест работает при установке 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, и из-за этого у вас не может быть пустого массива в качестве аргумента.
Помогло мне понять, что мне нужна форма, чтобы быть правдой.
В качестве быстрой проверки работоспособности, если вы перейдете на вкладку сети в Chrome после запуска этого теста, будет ли сгенерированный запрос содержать
subjects: []?