unit test run make create database unit-testing laravel-5 phpunit seeding

run - Laravel 5 Reseeding the Database for Unit Testing between Tests



refresh database laravel (2)

¿Por qué no creas tu propio comando como db: reset? Este comando trunca todas sus tablas o descarta / crea el esquema y luego migra.

En su prueba, usted usa: $this->call(''db:reset'') entre sus pruebas

Comienzo con una base de datos sin semilla y estoy tratando de resembrar la base de datos entre pruebas de unidad en Laravel 5. En Laravel 4 entiendo que podría simplemente usar Illuminate / Support / Facades / Artisan y ejecutar los comandos

Artisan :: call (''migrar''); Artisan :: call (''db: seed'');

o supuestamente podrías hacer:

$ this-> seed (''DatabaseSeeder'');

antes de cada prueba. En Laravel 5 esto parece haber sido reemplazado por

use DatabaseMigrations; o use DatabaseTransactions;

He intentado usar estos y he logrado obtener las pruebas para migrar la base de datos; sin embargo, en realidad no resembra los datos en las tablas. He leído varios foros quejándose de esto y he intentado varios enfoques diferentes llamando a estos desde el TestCase y dentro de cada Test ... agregando el

$this->beforeApplicationDestroyed(function () { Artisan::call(''migrate''); Artisan::call(''migrate:reset''); Artisan::call(''db:seed''); DB::disconnect(); });

al TestCase.php tearDown () ...

También intenté agregar

$this->createApplication();

a un método llamado en cada prueba de TestCase.php

A veces simplemente borra mis mesas por completo. Nada de lo que encuentro en el sitio de Laravel o en los blogs parece funcionar. Parte de esto es probablemente porque probablemente estoy probando los métodos de Laravel 4 en Laravel 5. ¿Hay alguna forma de hacerlo en Laravel 5?

Mi código para el testcase.php se ve así:

<?php use Illuminate/Support/Facades/Artisan as Artisan; class TestCase extends Illuminate/Foundation/Testing/TestCase{ use Illuminate/Foundation/Testing/WithoutMiddleware; use Illuminate/Foundation/Testing/DatabaseMigrations; use Illuminate/Foundation/Testing/DatabaseTransactions; protected $baseUrl = ''http://localhost''; public function initializeTests(){ $this->createApplication(); Artisan::call(''migrate''); $this->artisan(''migrate''); Artisan::call(''db:seed''); $this->artisan(''db:seed''); $this->seed(''DatabaseSeeder''); $this->session([''test'' => ''session'']); $this->seed(''DatabaseSeeder''); } public function tearDown() { Mockery::close(); Artisan::call(''migrate:reset''); $this->artisan(''migrate:reset''); Artisan::call(''migrate:rollback''); $this->artisan(''migrate:rollback''); Artisan::call(''migrate''); $this->artisan(''migrate''); Artisan::call(''db:seed''); $this->artisan(''db:seed''); $this->seed(''DatabaseSeeder''); DB::disconnect(); foreach (/DB::getConnections() as $connection) { $connection->disconnect(); } $this->beforeApplicationDestroyed(function () { Artisan::call(''migrate:reset''); $this->artisan(''migrate:reset''); Artisan::call(''migrate:rollback''); $this->artisan(''migrate:rollback''); Artisan::call(''migrate''); $this->artisan(''migrate''); Artisan::call(''db:seed''); $this->artisan(''db:seed''); $this->seed(''DatabaseSeeder''); DB::disconnect(); foreach (/DB::getConnections() as $connection) { $connection->disconnect(); } }); $this->flushSession(); parent::tearDown(); } public function getConnection() { $Connection = mysqli_connect($GLOBALS[''DB_DSN''], $GLOBALS[''DB_USERNAME''], $GLOBALS[''DB_PASSWORD''], $GLOBALS[''DB_DATABASE'']); $this->createDefaultDBConnection(); return $this->Connection; } public function createApplication() { $app = require __DIR__.''/../bootstrap/app.php''; $app->make(Illuminate/Contracts/Console/Kernel::class)->bootstrap(); return $app; } /** * Magic helper method to make running requests simpler. * * @param $method * @param $args * @return /Illuminate/Http/Response */ public function __call($method, $args) { if (in_array($method, [''get'', ''post'', ''put'', ''patch'', ''delete''])) { return $this->call($method, $args[0]); } throw new BadMethodCallException; } /** * Create a mock of a class as well as an instance. * * @param $class * @return /Mockery/MockInterface */ public function mock($class) { $mock = Mockery::mock($class); $this->app->instance($class, $mock); return $mock; } }

Mi prueba se parece más a

<?php use Illuminate/Foundation/Testing/WithoutMiddleware; use Illuminate/Foundation/Testing/DatabaseMigrations; use Illuminate/Foundation/Testing/DatabaseTransactions; use Illuminate/Database/Seeder; use Illuminate/Support/Facades/Artisan; class CustomerRegistrationControllerTest extends TestCase { use DatabaseMigrations; protected static $db_inited = false; protected static function initDB() { echo "/n---Customer Registration Controller Tests---/n"; // proof it only runs once per test TestCase class Artisan::call(''migrate''); Artisan::call(''db:seed''); } public function setUp() { parent::setUp(); if (!static::$db_inited) { static::$db_inited = true; static::initDB(); } // $this->app->refreshApplication(); $this->artisan(''migrate:refresh''); $this->seed(); $this->seed(''DatabaseSeeder''); $this->initializeTests(); ); } public function testSomething() { $this->Mock ->shouldReceive(''destroy'') ->with(''1'') ->andReturn(); $this->RegistrationController->postRegistration(); // $this->assertResponseStatus(200); } }


Solo ejecuta esto:

$this->artisan(''migrate:refresh'', [ ''--seed'' => ''1'' ]);

Para evitar cambios en la base de datos que persisten entre las pruebas, agregue el use DatabaseTransactions a las pruebas que golpean la base de datos.