测试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()方法吗?
感谢。
答案 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。