2014-02-20 1 views
3

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


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

OneTimeNote:delete --days=25 

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


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

Как вы можете видеть, я инъекционный мою реализацию Примечания (абстракцию), а затем я выполнение один из его методы «deleteNotesOlderThan (INT $ дней). Как я уже сказал, все это прекрасно работает и денди. Моя проблема начинается, когда я пытаюсь проверить вещь.


Команда Test: http://pastebin.com/6UwxGvcN

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

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

ответ

6

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

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

От 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 по команде, передавая «поддельные» классы ввода и вывода.

+0

Спасибо за помощь. Я пошел вперед и сделал то, что вы предлагали, но с добавленной функциональностью инструментов CommandTester от Symfony. Есть ли у вас какие-либо предложения о том, что я должен проверить с помощью моей конкретной команды? – Pathsofdesign

+2

Вы заметите, что в целом команды в Laravel не делают много. Они откладывают свою * актуальную * функциональность до классов бизнес-логики, которые делают тяжелую работу. Если вы серьезно относитесь к разработке и тестированию кода, вы должны следовать одному и тому же пути. Ваша команда должна просто анализировать аргументы командной строки и передавать все это. Этот класс должен быть протестирован так, чтобы он выполнял то, что ему нужно. В вашем случае можно утверждать, что репозиторий - это дополнительный класс бизнес-логики, поэтому вы можете просто захотеть убедиться, что его метод 'deleteNotesOlderThan' вызывается с правильными аргументами. – alexrussell

+1

Очевидно, что после этого вы должны убедиться, что репозиторий также полностью протестирован, в этом случае вы захотите убедиться, что для данного не издевающегося экземпляра репозитория вызов 'deleteNotesOlderThan' с различными входами делает правильные вещи ,Это слишком легко для людей, чтобы случайно проверить слишком много шляпы, как это делает метод, а не того, что он производит, когда дело доходит до насмешки, даже кодовая база Laravel может быть виновата в этом иногда. Прочтите мой ответ [здесь] (http://stackoverflow.com/a/21752195/1551393) для получения дополнительной информации. Я не эксперт по тестированию, поэтому сделайте то, что вы хотите, с моим советом. – alexrussell

 Смежные вопросы

  • Нет связанных вопросов^_^