Как стать автором
Обновить

Комментарии 6

Очень интересная статья и опыт. Спасибо. Но вот просмотрев основной код, можно выделить 2 основные задачи, которые ими решаются:
1) Короткое создание моков + удаление их в tearDown.
2) Парсинг докблока.
Могу ошибаться, но разве это не сложный велосипед? Для быстрого создания моков есть codeception/stub, а для парсинга докблока — phpDocumentor/ReflectionDocBlock (Но возможно не совсем подходит, конкретно под ваш кейс)

Показывая короткий и красивый код в самом тесте, вы, как мне кажется, не учитываете код, который придется писать в докблоке.

Беру теоретичсекий код, который должен работать, и все это заменить:

protected $mocks = [ ];
protected createMock($className, $constructorParams = [] ){
    //тут код создания мока
   $this->mocks[] = $mock;
    return $mock;
}

protected function tearDown()
    {
        $this->mocks = null; 
        parent::tearDown();
    }


Разве нет?

Спасибо за указание интересных библиотек.


Сначала отвечу на вопрос по поводу чистого кода теста и чистых phpDoc блоков. Да, вы правильно отметили, что механическое задание объектов для мокирования все равно должно присутствовать в том или ином виде. В нашем случае при указании объектов для мокирования тест получался настолько большим — из-за большего числа зависимостей в старом коде, который необходимо покрывать тестами, — что вариант с раздутыми аннотациями вкупе с возможностями IDE оказался предпочтительней.


В вашем предложении функцию createMock надо явно вызывать и явно указывать ее className, а также явно держать поле для нее: это следствие того, что у нас соглашение не использовать магические ассоциативные массивы, например, из-за плохого хинтинга. Тем не менее, соглашусь, что с случае хорошо написанных классов, которые тестируются, предложенный вариант, возможно, не является оптимальным.

Да, данную функцию нужно явно вызывать. Но в вашем случае надо явно прописывать: property className varible. Собственно по количеству символов ваш вариант не короче.
$var = $this->createMock(Class::class);
Против
@property Namespace\SubSpace\Class var 
$this->var;

а также явно держать поле для нее: это следствие того, что у нас соглашение не использовать магические ассоциативные массивы, например, из-за плохого хинтинга.

Да, вы используете класс propertyBag, в котором у вас хранится тот же массив. Не нравится массив? Используйте коллекцию. Да и тайпхинтинга у вас тоже нет. Ведь все создается динамически.

Еще раз повторюсь, ничего не имею против, классная статья, интересная идея и архитектура. Я для себя даже кое что подчерпнул. Но на мой взгляд — излишнее усложнение того, что можно сделать проще. Просто профита не вижу, от написанной сложности.

Еще раз спасибо за фидбек.


У нас в IDE (PhpStorm) Intelli Sens полноценно работает по такому phpDoc: подтягивает типы, подсказывает, как можно мокать по объекту PHPUnit_Framework_MockObject_MockObject, подсказывает, что входит в изначальную сигнатуру объекта. Именно поэтому (полноценно работающий Intelli Sens) такой вариант оказался очень удобным для нас.


Извиняюсь, что не указал это в исходной статье.

НЛО прилетело и опубликовало эту надпись здесь
Эта статья о том, как я решил проблему отказа от написания не несущего ценности кода
Непонятно как вы определяете ценность кода. Если речь идет про Boilerplate_code, то даже у него есть своя ценность. Иначе его бы не писали.

По теме, чем аннотации лучше абстрактных классов, трейтов, хелперов?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории