2016-07-25 5 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) 
{ 
    // 
} 

次に、このようなテストケースまで書く:あなたが呼び出すことができますどこ$this->app->instance('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(); 

を実際のクラスの代わりに、クラスやオブジェクトの模擬バージョンを使用してください。

これはLaravelまたはLumenで機能します。