Laravel 4.1 — Тестирование команды Artisan с помощью Phpunit и Mockery

Я пишу свою первую команду Artisan в Laravel 4.1 и хотел получить некоторые идеи о том, как ее протестировать. Моя команда делает одну вещь (пока). Он в основном удаляет записи таблицы (заметки) из БД, которым задано определенное количество дней.


Пример команды:

OneTimeNote:delete --days=25

Команда работает с честью. Но сначала я написал команду для обучения, а теперь хочу проверить ее. Я использую PHPUnit и Mockery.


Код команды: http://pastebin.com/index/dZrxpt8x

Как видите, я внедряю свою реализацию Note (для абстракции), а затем выполняю один из ее методов 'deleteNotesOlderThan(int $days)'. Как я уже сказал, все это работает отлично и денди. Моя проблема начинается, когда я пытаюсь проверить вещь.


Проверка команды: http://pastebin.com/6UwxGvcN.

Если вы посмотрите на код, вы увидите, где я застрял. Как смоделировать мой метод Note и сгенерировать командный тест? Кроме того, какие вещи я должен тестировать с помощью этой конкретной команды?

заранее спасибо


person Pathsofdesign    schedule 20.02.2014    source источник


Ответы (1)


Я бы посоветовал следовать примерам, приведенным для вас в Laravel.

Выбирая случайный ремесленный тест из фреймворка, похоже, что вам не нужен класс Symfony «CommandTester», но вместо этого вы просто создаете экземпляр и работаете.

Из https://github.com/laravel/framework/blob/master/tests/Foundation/FoundationConfigPublishCommandTest.php: (тема ссылки может устареть)

public function testCommandCallsPublisherWithProperPackageName()
{
    $command = new Illuminate\Foundation\Console\ConfigPublishCommand($pub = m::mock('Illuminate\Foundation\ConfigPublisher'));
    $pub->shouldReceive('publishPackage')->once()->with('foo');
    $command->run(new Symfony\Component\Console\Input\ArrayInput(array('package' => 'foo')), new Symfony\Component\Console\Output\NullOutput);
}

Таким образом, вы создаете экземпляр своей команды, передавая свой макетный интерфейс репозитория, добавляете свои ожидания к макету, затем вызываете run в команде, передавая «поддельные» входные и выходные классы.

person alexrussell    schedule 20.02.2014
comment
Спасибо за помощь. Я пошел дальше и сделал, как вы предложили, но с добавленной функциональностью инструментов Symfony CommandTester. Есть ли у вас какие-либо предложения о том, что я должен проверить с моей конкретной командой? - person Pathsofdesign; 21.02.2014
comment
Вы заметите, что в целом команды в Laravel мало что делают. Они доверяют свою действительную функциональность классам бизнес-логики, которые выполняют тяжелую работу. Если вы серьезно относитесь к дизайну и тестированию кода, вам следует идти по тому же пути. Ваша команда должна просто анализировать аргументы командной строки и передавать их дальше. Этот класс следует протестировать, чтобы он делал то, что должен. В вашем случае можно утверждать, что репозиторий является этим дополнительным классом бизнес-логики, поэтому вы можете просто убедиться, что его метод deleteNotesOlderThan вызывается с правильными аргументами. - person alexrussell; 21.02.2014
comment
Очевидно, что после этого вы также должны убедиться, что репозиторий полностью протестирован, в этом случае вы захотите убедиться, что для данного экземпляра репозитория без макета вызов deleteNotesOlderThan с различными входными данными делает правильные вещи. Людям слишком легко случайно проверить слишком много того, что делает метод, а не то, что он производит, когда дело доходит до насмешек, даже кодовая база Laravel иногда может быть виновата в этом. Прочитайте мой ответ здесь для получения дополнительной информации. Я не эксперт по тестированию, поэтому делайте, что хотите, с моим советом. - person alexrussell; 21.02.2014