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.