Аналог shoulda matchers для Yii 2.x

Выкладываем свои наработки
Ответить
Аватара пользователя
Roksalana
Сообщения: 213
Зарегистрирован: 2014.01.14, 09:34

Аналог shoulda matchers для Yii 2.x

Сообщение Roksalana » 2015.07.19, 18:55

Наконец дошли руки, написала простенький класс для облегчения unit-тестирования моделей. Скачать можно с гитхаба.
Пример использования:

Код: Выделить всё

   public function testPhoneIsSafeOnlyOnRegistration()
    {
         $userModel = new ModelMatcher('app\models\User');
         $userModel->shouldBeSafe('phone', 'registration');
         $userModel->shouldBeNotSafe('phone');
    }

     public function testUserHasPostsRelation()
     {
         $userModel = new ModelMatcher('app\models\User');
         $userModel->hasMany('posts', 'app\models\Post', ['user_id' => 'id']);
     }
Пока методов маловато: проверка safe-атрибутов, required-атрибутов, проверка на наличие связей у модели. Но если вещь окажется нужной, допишу еще matcher-ов (напишите каких не хватает в первую очередь). Вообщем жду вердикта yii-сообщества :roll:

lynicidn
Сообщения: 2221
Зарегистрирован: 2014.05.24, 15:12

Re: Аналог shoulda matchers для Yii 2.x

Сообщение lynicidn » 2015.07.19, 22:14

особо выгоды нет, думаю интересней было бы - тестировать по фикстурам - валидные, не валидные (не лоадить вбазу),
затея так то крутая, но даже нет поддержки массивов аттрибутов :(
а так все это делается просто assertTrue($model->isSafeAttribute('phone'))
облегчило бы тестить к примеру сразу сценарий, от и до, и к примеру прилагать что ожидается - массив ошибок или тру(при сохранении)
охватить - валидацию и сохранение

Аватара пользователя
Roksalana
Сообщения: 213
Зарегистрирован: 2014.01.14, 09:34

Re: Аналог shoulda matchers для Yii 2.x

Сообщение Roksalana » 2015.07.20, 11:32

lynicidn писал(а):особо выгоды нет, думаю интересней было бы - тестировать по фикстурам - валидные, не валидные (не лоадить вбазу),
а так все это делается просто assertTrue($model->isSafeAttribute('phone'))
облегчило бы тестить к примеру сразу сценарий, от и до, и к примеру прилагать что ожидается - массив ошибок или тру(при сохранении)
охватить - валидацию и сохранение
Думаю очень сложно создать фикстуры на все вариации валидных и не валидных данных. А для одного атрибута такая проверка есть. Те в тесте пишем тех требование, например "логин должен быть не менее 5 символов".

Код: Выделить всё

$validator = new ModelMatcher('app\models\User');
$validator->matchLength('login', 5);
 
Код теста сам создает валидную и не валидную строку и проверяет, что модель правильно ее провалидировала. Нужно просто дописать побольше таких matcher-ов. Можно даже вообще абстрагироваться от реализации в модели, но пока у меня загвоздка в регулярных выражениях. Для того-же логина у меня валидация не проходит из-за наличия других правил, а генерить строку по регулярке я еще не пробовала.
lynicidn писал(а): затея так то крутая, но даже нет поддержки массивов аттрибутов :(
Думала об этом, но потом решила, что множество assert-ов в одном тесте не есть хорошо. Нужно разобраться, как генерировать собственный текст ошибок в phpUnit тогда можно делать массив атрибутов. А пока представьте у вас тест падает и говорит "Failed asserting that false is true" и поди догадайся для какого атрибута из массива атрибутов не прошла валидация.

Спасибо за коммент и мнение :)

Ответить