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

时间:2016-07-25 14:02:43

标签: laravel-5 phpunit

测试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()方法吗?

感谢。

1 个答案:

答案 0 :(得分:3)

您将不得不改变在测试中调用命令的方式,但可以模拟传递的对象。

如果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。