我在Laravel 4.1中编写了我的第一个Artisan命令,想要了解如何测试它。我的命令做了一件事(现在)。它基本上从DB中删除指定天数的表条目(Notes)。
命令示例:
OneTimeNote:delete --days=25
该命令适用于飞行颜色。但是我先把这个命令写成了学习目的,现在我希望用它来测试。我正在使用PHPUnit和Mockery。
命令代码: http://pastebin.com/index/dZrxpt8x
正如你所看到的,我正在注入我的Note实现(用于抽象),然后我正在执行其中一个方法'deleteNotesOlderThan(int $ days)'。就像我说的,这一切都很好,花花公子。当我试图测试时,我的问题就开始了。
命令测试:http://pastebin.com/6UwxGvcN
如果你查看代码,你可以看到我被困在哪里。我如何模拟我的Note方法并生成命令测试?我应该用这个特定的命令测试什么样的东西?
提前谢谢
答案 0 :(得分:6)
我的建议是遵循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
,传入'假的'输入和输出类。