Не използвай супер-глобални ($ _SESSION, $ _GET, $ _POST, etc…) или глобални променливи вътре в тестваната функция!
Със сигурност не използвай $ _SESSION, $ _GET, $ _POST вътре, защото Unit Test-овете се рънват през командният ред и така или иначе нямаш сесии, ГЕТ, ПОСТ…
public function getCurrentUser(){ $user_id = $ _SESSION['user_id']; $user = App::db->select('id, username') ->where('id', $user_id) ->limit(1) ->get(); if ($user->num_results() > 0) { return $user->row(); } return false; }
Например, не пиши:
Това не е testable.
Подавай го отвън това $user_id, за да можеш да тестваш тази функция, като и подаваш различни user_id-та.
А не така, хардкоднато.
2) Подобно на точка 1), не създавай обект вътре във функцията, която ще тестваш, създай го извън нея и и го подай като праметър (dependency injection).
3) Старай се една функция да има колкото може по малко параметри, защото всяка комбинация от параметри значи отделен тест сценарий.
4) Една функция трябва да прави само едно нещо, в смисъл, не трябва в една ф-я да има сейв в ДБ, пращане на емайл, дисплаей на някакаъв месидж…Демек, „всяка функция да си знае функцията“, както и жабата – гьола.
Източник: https://codeburst.io/writing-php-unit-testing-friendly-code-5ef9a8a49da1
Don’t assume global context
Don’t create new global variables
Rely only on direct inputs
Do not use exit() – недей да си гърмиш кода с die() или exit(), по-добре хвърляй Ексепшъни, и естествено, ги прихващай.
Източник: https://www.mediawiki.org/wiki/Manual:Writing_testable_PHP_code