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

5

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

这里有一个我正在运行的命令示例。它在构造函数和处理方法中都需要一个值。

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()方法传递所有内容吗?

谢谢。


你想要在这个实例中模拟一个 $a 吗?不仅仅是传递实际对象吗? - random
在这种情况下,它是我的记录器,所以我不想传递真实的实例。 - Aine
1个回答

4
你需要改变测试中调用命令的方式,但可以对传递的对象进行模拟。如果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。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接