我正在 Laravel 4.1 中编写我的第一个 Artisan 命令,想获得一些关于如何测试它的想法。我的命令只做一件事(目前)。它基本上从数据库中删除指定天数的表条目(注释)。
命令示例:
OneTimeNote:delete --days=25
该命令效果极佳。但我首先出于学习目的编写了命令,现在我希望通过测试来遵循它。我正在使用 PHPUnit 和 Mockery。
命令代码: http://pastebin.com/index/dZrxpt8x
如您所见,我正在注入(inject)我的 Note 实现(用于抽象),然后我正在执行它的方法之一“deleteNotesOlderThan(int $days)”。就像我说的,这一切都很好而且花花公子。当我尝试测试这个东西时,我的问题就开始了。
命令测试:http://pastebin.com/6UwxGvcN
如果您查看代码,您就会明白我卡在哪里了。如何模拟我的 Note 方法并生成命令测试?另外,我应该用这个特定的命令测试什么样的东西?
提前致谢
最佳答案
我的建议是遵循 Laravel 中为您提供的示例。
从框架中随机选择一个 artisan 测试,看起来您不需要 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);
}
所以你实例化你的命令,传入你的模拟存储库接口(interface),将你的期望添加到模拟中,然后在命令上调用 run
,传入“假”输入和输出类。
关于php - Laravel 4.1 - 使用 Phpunit 和 Mockery 测试 Artisan 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21913211/