unitarias styde reconoce pruebas programa por para lotes interno hacer framework externo ejecutable correr como comando archivo php unit-testing laravel laravel-5 laravel-5.1

styde - pruebas unitarias php



Pruebas de unidad de comando Laravel 5 consola(artesanal) (1)

Estoy migrando mi aplicación Laravel 4.2 a 5.1 (comenzando con 5.0) y tengo muchos problemas con las pruebas de la unidad de comando de la consola. Tengo comandos de artesanos para los que necesito probar el resultado de la consola producida, el manejo adecuado de la pregunta / respuesta y las interacciones con otros servicios (utilizando simulacros). A pesar de todos sus méritos, desafortunadamente, el documento de Laravel no menciona los comandos de la consola de prueba.

Finalmente encontré una forma de crear esas pruebas, pero se siente como un truco con esas llamadas setLaravel y setApplication .

¿Hay una mejor manera de hacer esto? Desearía poder agregar mis instancias simuladas al contenedor IoC de Laravel y dejar que cree los comandos para probar con todo lo configurado correctamente. Me temo que las pruebas de mi unidad se romperán fácilmente con las versiones más nuevas de Laravel.

Aquí está mi prueba de unidad:

Usar declaraciones:

use Mockery as m; use App/Console/Commands/AddClientCommand; use Symfony/Component/Console/Tester/CommandTester;

Preparar

public function setUp() { parent::setUp(); $this->store = m::mock(''App/Services/Store''); $this->command = new AddClientCommand($this->store); // Taken from laravel/framework artisan command unit tests // (e.g. tests/Database/DatabaseMigrationRollbackCommandTest.php) $this->command->setLaravel($this->app->make(''Illuminate/Contracts/Foundation/Application'')); // Required to provide input to command questions (provides command->getHelper()) // Taken from ??? when I first built my command tests in Laravel 4.2 $this->command->setApplication($this->app->make(''Symfony/Component/Console/Application'')); }

Entrada proporcionada como argumentos de comando. Comprueba la salida de la consola

public function testReadCommandOutput() { $commandTester = new CommandTester($this->command); $result = $commandTester->execute([ ''--client-name'' => ''New Client'', ]); $this->assertSame(0, $result); $templatePath = $this->testTemplate; // Check console output $this->assertEquals(1, preg_match(''/^Client /'New Client/' was added./m'', $commandTester->getDisplay())); }

Entrada proporcionada por teclas de teclado simuladas

public function testAnswerQuestions() { $commandTester = new CommandTester($this->command); // Simulate keyboard input in console for new client $inputs = $this->command->getHelper(''question''); $inputs->setInputStream($this->getInputStream("New Client/n")); $result = $commandTester->execute([]); $this->assertSame(0, $result); $templatePath = $this->testTemplate; // Check console output $this->assertEquals(1, preg_match(''/^Client /'New Client/' was added./m'', $commandTester->getDisplay())); } protected function getInputStream($input) { $stream = fopen(''php://memory'', ''r+'', false); fputs($stream, $input); rewind($stream); return $stream; }

actualizaciones

  1. Esto no funciona en Laravel 5.1 # 11946

He hecho esto antes de la siguiente manera: mi comando de consola devuelve una respuesta json:

public function getConsoleResponse() { $kernel = $this->app->make(Illuminate/Contracts/Console/Kernel::class); $status = $kernel->handle( $input = new Symfony/Component/Console/Input/ArrayInput([ ''command'' => ''test:command'', // put your command name here ]), $output = new Symfony/Component/Console/Output/BufferedOutput ); return json_decode($output->fetch(), true); }

Entonces, si quieres poner esto en su propia clase de probador de comandos, o como una función dentro de TestCase, etc. depende de ti.