Laravel 5 使用phpunit测试Laravel(5.1)控制台命令

Laravel 5 使用phpunit测试Laravel(5.1)控制台命令,laravel-5,phpunit,Laravel 5,Phpunit,测试Laravel控制台命令的最佳方法是什么 下面是我正在运行的一个命令示例。它在构造函数和handle方法中接受一个值 class DoSomething extends Command { protected $signature = 'app:do-something'; protected $description = 'Does something'; public function __construct(A $a) { ...

测试Laravel控制台命令的最佳方法是什么

下面是我正在运行的一个命令示例。它在构造函数和handle方法中接受一个值

class DoSomething extends Command
{
    protected $signature = 'app:do-something';
    protected $description = 'Does something';

    public function __construct(A $a)
    {
        ...
    }

    public function handle(B $b)
    {
        ...    
    }
}
在我的测试课上,我可以模拟A和B,但我不知道如何通过A

$this->artisan('app:do-something', [$b]);
可能吗?还是我完全错了?我应该将所有内容都传递给handle()方法吗


谢谢。

您必须改变在测试中调用命令的方式,但是可以模拟通过的对象

如果Artisan使用的类是按如下方式注入的依赖项:

public function __construct(ActualObject $mocked_A)
{
    //
}
然后像这样编写测试用例:

$mocked_A = Mockery::mock('ActualObject');
$this->app->instance('ActualObject', $mocked_A);

$kernel = $this->app->make(Illuminate\Contracts\Console\Kernel::class);
$status = $kernel->handle(
    $input = new Symfony\Component\Console\Input\ArrayInput([
        'command' => 'app:do-something',
    ]),
    $output = new Symfony\Component\Console\Output\BufferedOutput
);
$console_output = $output->fetch();
$this->app->instance('ActualObject',$mocked_A)行是您可以调用和使用类或对象的模拟版本,而不是实际版本的代码


这将在Laravel或Lumen中工作。

您想在这种情况下模拟$A吗?不只是通过实际对象?在本例中,它是我的记录器,所以我不想通过实际实例。