2016-07-25 14 views
3

Was ist der beste Weg, um Laravel-Konsolenbefehle zu testen?Testen von Laravel (5.1) Konsolenbefehlen mit phpunit

Hier ist ein Beispiel für einen Befehl, den ich ausführe. Es nimmt einen Wert im Konstruktor und in der Handle-Methode auf.

class DoSomething extends Command 
{ 
    protected $signature = 'app:do-something'; 
    protected $description = 'Does something'; 

    public function __construct(A $a) 
    { 
     ... 
    } 

    public function handle(B $b) 
    { 
     ...  
    } 
} 

In meiner Test-Klasse, kann ich sowohl A als auch B verspotten, aber ich kann nicht herausfinden, wie $ einen in zu übergeben.

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

Ist es möglich? Oder mache ich das alles falsch? Soll ich alles in Gedanken an die handle() -Methode weitergeben?

Danke.

+0

Sie möchten in diesem Fall A $ a vortäuschen können? Nicht nur durch das eigentliche Objekt gehen? – random

+0

In diesem Fall war es mein Logger, also wollte ich die reale Instanz nicht weitergeben. – Aine

Antwort

2

Sie müssen ändern, wie Sie den Befehl in testing aufrufen, aber es ist möglich, ein Objekt vorzuspielen, das übergeben wird.

Wenn die Klasse von Artisan verwendet wird, ist abhängigkeits injiziert wie folgt aus:

public function __construct(ActualObject $mocked_A) 
{ 
    // 
} 

Dann den Testfall wie folgt aufschreiben:

$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(); 

Die $this->app->instance('ActualObject', $mocked_A); Linie ist, wo Sie in der Lage sind zu nennen auf und verwenden Sie die verspottete Version Ihrer Klasse oder Ihres Objekts anstelle des tatsächlichen.

Dies funktioniert in Laravel oder Lumen.