2016-07-25 118 views
3

測試Laravel控制檯命令的最佳方式是什麼?使用phpunit測試Laravel(5.1)控制檯命令

這裏是我運行一個命令的例子。它在構造函數和句柄方法中都有一個值。

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,但我無法弄清楚如何通過$一英寸

$this->artisan('app:do-something', [$b]); 

這可能嗎?或者,我是否全力以赴?我是否應該將所有想法都通過handle()方法?

謝謝。

+0

你想在這個例子中模擬A $ a嗎?不只是通過實際的對象? – random

+0

在這種情況下,它是我的記錄器,所以我不想傳入實際情況。 – Aine

回答

2

你將有你如何在測試中調用命令來更改左右,但有可能嘲笑的對象穿過。

如果由工匠使用的類是依賴注入是這樣的:

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或流明工作。