【问题标题】:Testing Laravel (5.1) console commands with phpunit使用 phpunit 测试 Laravel (5.1) 控制台命令
【发布时间】:2016-11-28 22:03:58
【问题描述】:

测试 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 $a 吗?不只是通过实际对象?
  • 在这种情况下,它是我的记录器,所以我不想传入真实的实例。

标签: laravel-5 phpunit


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2016-01-31
    • 1970-01-01
    • 2017-01-08
    • 2015-09-26
    • 2015-08-25
    • 1970-01-01
    • 2019-03-05
    • 2014-03-21
    • 1970-01-01
    相关资源
    最近更新 更多