Маленький баг в тестировании на Laravel

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

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

Статья будет небольшая, даже совсем короткая. Для фанатов TDD, верящих, что фреймворки делают в небесах.

Пару часов ковырялась с тестом $response->assertJson()->assertJsonMissing(); при одинаковом содержании обеих скобок:

$response
	->assertJson(['data' => [Something::first->toArray()]])
  ->assertJsonMissing(['data' => [Something::first()->toArray()]]);

Этот тест проходил. И утверждал, что нечто одновременно содержится и отсутствует в ответе апи.

Собственно, всё это нужно было, чтобы проверить, верно ли мой новый scope в модели Something отбраковывает элементы.

Казалось бы: пишешь тест "в ответе содержится нечто, что там как раз должно быть". И тест проходит. Далее обращаешь логику окончанием Missing. При старых данных новый тест должен падать.

А тут - не упал.

В итоге выяснила, что проблема в названии. Функция assertJson() проверяет наличие в ответе апи любого массива, в том числе - с большой вложенностью. Причём это вы должны ей дать аргумент с нужным количеством квадратных скобок.

А assertJsonMissing() ищет в ответе на любом уровне, избавляя вас от отслеживания квадратных скобок. Зато берёт в качестве аргумента только плоские массивы, без дополнительной вложенности. В частности, мне оказалось достаточно в скобках для assertJsonMissing() в последней строчке оставить чистую Something::first()->toArray(), убрав там ключ 'data':

$response->assertJsonMissing(Something::first()->toArray());

О том, что это - проблема нейминга функций тестирования, пишут ещё с пятой версии ларки, с 2017: https://github.com/laravel/framework/issues/20431 . В частности, есть комментарий о том, что assertJsonMissing - это обратная не для assertJson, а для assertJsonFragment.

Там же есть ссылка на https://laravel.com/docs/8.x/http-tests#fluent-json-testing для тестирования на отсутствие в джейсоне атрибута... то есть, собственно, снова плоский вариант тестирования.

ЗЫ решила вам написать об этом, поскольку мне тема стоила пары нервных часов. Очень нервных. От обращённого - на словах - утверждения ожидаешь и поведения обращённого. При одинаковых данных из них проходить должен ровно один.

Но нейминг функций фреймворка - это тяжёлый труд. И закрепившиеся на сегодня названия функций (как минимум, у available assertions для тестирования в Laravel) могут вести к неоправданным ожиданиям от их работы.

Источник: https://habr.com/ru/post/664098/


Интересные статьи

Интересные статьи

Всем привет. Как часто вам нужно разрабатывать сотни авто тестов и предоставлять заинтересованным лицам отчеты с результатами? Лично мне очень часто. В этом мне помогает Anna.
В прошлой части мы поговорили о советах директору по разработке бизнес-процесса в Битрикс24, сейчас же я постараюсь дать советы руководителям отделов, поскольку по моему опыту почти всегд...
Многие компании в определенный момент приходят к тому, что ряд процессов в бизнесе нужно автоматизировать, чтобы не потерять свое место под солнцем и своих заказчиков. Поэтому все...
Устраивать конкурсы в инстаграме сейчас модно. И удобно. Инстаграм предоставляет достаточно обширный API, который позволяет делать практически всё, что может сделать обычный пользователь ручками.
Если в вашей компании хотя бы два сотрудника, отвечающих за работу со сделками в Битрикс24, рано или поздно возникает вопрос распределения лидов между ними.