Я подготовил образец API с Laravel. Он всегда возвращает этот объект:
{
"a": 1,
"b": 2
}
Теперь я хотел бы лучше понять, как это тестировать с phpunit. Я обнаружил, что существуют методы assertJson и assertJsonFragment, и не могу понять разницу между ними.
Допустим, я хотел бы подтвердить точную структуру ответа, поэтому это должны быть a=1 и b=2, ни больше, ни меньше. Сначала я был уверен, что это сработает:
$response = $this->get('/api/foo');
$response->assertStatus(200)
->assertJson(['a' => 1, 'b' => 2]);
Он пройдет проверку, но проблема в том, что он все равно пройдет проверку, если я добавлю к ответу дополнительные свойства, например c=3 или что-то еще. Затем есть метод assertJsonFragment, который в моих тестах ведет себя одинаково, только выдает разные сообщения об ошибках.
assertJson глючит? Есть ли другой способ сделать то, что я пытаюсь сделать, - просто убедиться, что ответ - это конкретный набор свойств?
Проверено на Laravel 5.6 и 5.7.






От здесь:
The
assertJsonmethod converts the response to an array and utilizesPHPUnit::assertArraySubsetto verify that the given array exists within the JSON response returned by the application. So, if there are other properties in the JSON response, this test will still pass as long as the given fragment is present.
И что еще более важно, чтобы добиться желаемого:
If you would like to verify that the given array is an exact match for the JSON returned by the application, you should use the
assertExactJsonmethod
Вы знаете, что делает assertJsonFragment?
@RoboRobok assertJson проверяет каждую предоставленную вами пару значений ключа, чтобы увидеть, присутствует ли в ответе в любом месте (на любом уровне вложенности), тогда как assertJsonFragment ищет в вашем ответе точный фрагмент, который вы предоставили. Это видео это хорошо объясняет. Он использует более старый синтаксис seeJson / seeJsonSubset, а не assertJson / assertJsonFragment, но общая информация верна.
Тогда это соглашение об именах не имеет особого смысла. Во всяком случае, должно быть наоборот.
Да, многие соглашаются, и, к сожалению, официальной документации немного не хватает для понимания разницы.
assertExactJson- это мой путь туда.