我将Laravel 4.2应用程序迁移到5.1(从5.0开始),并且我的控制台命令单元测试很麻烦.我有工匠指令,我需要测试产生的控制台输出,正确的问题/响应处理和与其他服务的交互(使用嘲笑).对于所有的优点,Laravel文档对于测试控制台命令而言是不幸的.
我终于找到了一种创建这些测试的方法,但它感觉就像是使用setLaravel和setApplication调用的一个黑客.
有没有更好的方法来做到这一点?我希望我可以将我的模拟实例添加到Laravel IoC容器中,并让它创建用于测试所有正确设置的命令.恐怕我的单元测试会随着更新的Laravel版本而轻松破解.
这是我的单元测试:
使用陈述:
use Mockery as m; use App\Console\Commands\AddClientCommand; use Symfony\Component\Console\Tester\CommandTester;
建立
public function setUp() { parent::setUp(); $this->store = m::mock('App\Services\Store'); $this->command = new AddClientCommand($this->store); // Taken from laravel/framework artisan command unit tests // (e.g. tests/Database/DatabaseMigrationRollbackCommandTest.PHP) $this->command->setLaravel($this->app->make('Illuminate\Contracts\Foundation\Application')); // required to provide input to command questions (provides command->getHelper()) // Taken from ??? when I first built my command tests in Laravel 4.2 $this->command->setApplication($this->app->make('Symfony\Component\Console\Application')); }
输入作为命令参数提供.检查控制台输出
public function testReadCommandOutput() { $commandTester = new CommandTester($this->command); $result = $commandTester->execute([ '--client-name' => 'New Client',]); $this->assertSame(0,$result); $templatePath = $this->testTemplate; // Check console output $this->assertEquals(1,preg_match('/^Client \'New Client\' was added./m',$commandTester->getDisplay())); }
模拟键盘提供的输入
public function testAnswerQuestions() { $commandTester = new CommandTester($this->command); // Simulate keyboard input in console for new client $inputs = $this->command->getHelper('question'); $inputs->setInputStream($this->getInputStream("New Client\n")); $result = $commandTester->execute([]); $this->assertSame(0,$commandTester->getDisplay())); } protected function getInputStream($input) { $stream = fopen('PHP://memory','r+',false); fputs($stream,$input); rewind($stream); return $stream; }
更新
>这不适用于Laravel 5.1 #11946
@H_403_27@@H_403_27@
我以前做过如下 – 我的控制台命令返回一个json响应:
public function getConsoleResponse() { $kernel = $this->app->make(Illuminate\Contracts\Console\Kernel::class); $status = $kernel->handle( $input = new Symfony\Component\Console\Input\ArrayInput([ 'command' => 'test:command',// put your command name here ]),$output = new Symfony\Component\Console\Output\BufferedOutput ); return json_decode($output->fetch(),true); }
所以如果你想把它放在它自己的命令测试器类,或者作为TestCase等中的一个功能,直到你.
@H_403_27@