Laravel 4.1 - 使用Phpunit和Mockery测试Artisan命令

Pat*_*ign 3 php testing laravel mockery

我在Laravel 4.1中编写了我的第一个Artisan命令,想要了解如何测试它.我的命令做了一件事(现在).它基本上从DB中删除指定天数的表条目(Notes).


命令示例:

OneTimeNote:delete --days=25
Run Code Online (Sandbox Code Playgroud)

该命令适用于飞行颜色.但是我先把这个命令写成了学习目的,现在我希望用它来测试.我正在使用PHPUnit和Mockery.


命令代码: http ://pastebin.com/index/dZrxpt8x

正如您所看到的,我正在注入我的Note实现(用于抽象),然后我执行其中一个方法'deleteNotesOlderThan(int $ days)'.就像我说的,这一切都很好,花花公子.当我试图测试这个东西时,我的问题开始了.


命令测试:http://pastebin.com/6UwxGvcN

如果你查看代码,你可以看到我被困在哪里.我如何模拟我的Note方法并生成命令测试?我应该用这个特定的命令测试什么样的东西?

先感谢您

ale*_*ell 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 Code Online (Sandbox Code Playgroud)

因此,您实例化您的命令,传入您的模拟存储库接口,将您的期望添加到模拟,然后调用run命令,传入'假的'输入和输出类.

  • 您会注意到,一般来说,Laravel中的命令不会做很多事情.他们将*实际*功能推迟到完成艰苦工作的业务逻辑类.如果您认真对待代码设计和测试,则应遵循相同的路径.您的命令应该只解析命令行参数并将其全部传递.应该对该类进行测试,以便它能够完成它应该做的事情.在您的情况下,可以认为存储库是这个额外的业务逻辑类,因此您可能只想确保使用正确的参数调用其`deleteNotesOlderThan`方法. (2认同)