使用 Mockey 测试交互式 artisan 命令
Testing interactive artisan commands using Mockey
我正在 Laravel 5.3 中编写交互式命令的单元测试 guide 但我似乎无法让 Mockery 工作。
我设置了一个简单的命令,greet:user。
public function handle()
{
if(!$name = $this->argument('name')) {
$name = $this->ask('Name of user to greet');
}
$this->info("Hello {$name}.");
}
我正在写 unit-tests 赞;
public function testCanGreetGivenUser()
{
$command = Mockery::mock('App\Console\Commands\GreetUser[info]');
$command->shouldReceive('info')->once()->with('Hello Brian.');
$exit_code = Artisan::call('greet:user', ['name' => 'Brian', '--no-interaction' => true]);
$this->assertEquals(trim(Artisan::output()), 'Hello Brian.');
$this->assertEquals($exit_code, 0);
}
问题:
Mockery\Exception\InvalidCountException: Method info("Hello Brian.") from Mockery_0_App_Console_Commands_GreetUser should be called
exactly 1 times but called 0 times.
我的目标是测试;
如果没有预期的输入
$this->artisan('greet:user', ['name' => 'Brian'])
->expectsOutput('Hello Brian.')
->assertExitCode(0);
如果需要输入。
$this->artisan('greet:user')
->expectsQuestion('Name of user to greet', 'James')
->expectsOutput('Hello James.')
->assertExitCode(0);
这就是我在 Laravel 5.7 中可以做到的,但是我怎样才能在 Laravel 5.3
中实现同样的效果
要解决问题,您必须按如下方式调用测试:
public function testCanGreetGivenUser()
{
$command = Mockery::mock('\App\Console\Commands\GreetUser[info]');
$command->shouldReceive('info')->once()->with('Hello Brian.');
$this->app[\Illuminate\Contracts\Console\Kernel::class]->registerCommand($command);
$exit_code = $this->artisan('greet:user', ['name' => 'Brian', '--no-interaction' => true]);
$this->assertEquals($exit_code, 0);
}
决定因素是命令注册。您必须这样做才能用您的模拟实际替换命令的现有实例。
我正在 Laravel 5.3 中编写交互式命令的单元测试 guide 但我似乎无法让 Mockery 工作。
我设置了一个简单的命令,greet:user。
public function handle()
{
if(!$name = $this->argument('name')) {
$name = $this->ask('Name of user to greet');
}
$this->info("Hello {$name}.");
}
我正在写 unit-tests 赞;
public function testCanGreetGivenUser()
{
$command = Mockery::mock('App\Console\Commands\GreetUser[info]');
$command->shouldReceive('info')->once()->with('Hello Brian.');
$exit_code = Artisan::call('greet:user', ['name' => 'Brian', '--no-interaction' => true]);
$this->assertEquals(trim(Artisan::output()), 'Hello Brian.');
$this->assertEquals($exit_code, 0);
}
问题:
Mockery\Exception\InvalidCountException: Method info("Hello Brian.") from Mockery_0_App_Console_Commands_GreetUser should be called
exactly 1 times but called 0 times.
我的目标是测试;
如果没有预期的输入
$this->artisan('greet:user', ['name' => 'Brian'])
->expectsOutput('Hello Brian.')
->assertExitCode(0);
如果需要输入。
$this->artisan('greet:user')
->expectsQuestion('Name of user to greet', 'James')
->expectsOutput('Hello James.')
->assertExitCode(0);
这就是我在 Laravel 5.7 中可以做到的,但是我怎样才能在 Laravel 5.3
中实现同样的效果要解决问题,您必须按如下方式调用测试:
public function testCanGreetGivenUser()
{
$command = Mockery::mock('\App\Console\Commands\GreetUser[info]');
$command->shouldReceive('info')->once()->with('Hello Brian.');
$this->app[\Illuminate\Contracts\Console\Kernel::class]->registerCommand($command);
$exit_code = $this->artisan('greet:user', ['name' => 'Brian', '--no-interaction' => true]);
$this->assertEquals($exit_code, 0);
}
决定因素是命令注册。您必须这样做才能用您的模拟实际替换命令的现有实例。