Це тести не поведінки, а структури коду: які класи де лежать, від чого залежать, що їм заборонено. У Pest вони пишуться функцією arch().
arch('models extend Eloquent')
->expect('App\Models')
->toExtend(Illuminate\Database\Eloquent\Model::class);
arch('no debugging leftovers')
->expect(['dd', 'dump', 'ray', 'var_dump'])
->not->toBeUsed();
arch('controllers stay thin')
->expect('App\Http\Controllers')
->not->toUse('Illuminate\Support\Facades\DB');
arch()->preset()->laravel();
arch()->preset()->security();
Що ними зручно фіксувати:
- забуті
dd()іdump(), які інакше потрапляють у продакшен; - межі шарів: домен не залежить від HTTP, контролери не пишуть сирі запити;
- угоди: усі завдання реалізують
ShouldQueue, усі enum - уApp\Enums, класиfinalчиreadonly, де так домовились; - небезпечні функції:
eval,exec,md5для паролів (пресетsecurity).
Навіщо, якщо є code review: рев'ю помічає порушення вибірково й залежить від уважності, а тест перевіряє кожен коміт. Архітектурні рішення, записані тестом, переживають зміну команди - їх не треба переказувати новачкам.
Обережно: правило без причини дратує й обходиться. Кожне має відповідати реальній домовленості, а не смаку.