J'essaie de recréer la base de données avant chaque test dans certains cas de test PHPUnit. J'utilise Laravel 5.3. Voici TestCase:
class CourseTypesTest extends TestCase
{
public function setUp()
{
parent::setUp();
Artisan::call('migrate');
Artisan::call('db:seed', ['--class' => 'TestDatabaseSeeder ', '--database' => 'testing']);
}
/**
* A basic functional test example.
*
* @return void
*/
public function test_list_course_types()
{
$httpRequest = $this->json('GET', '/api/course-types');
$httpRequest->assertResponseOk();
$httpRequest->seeJson();
}
public function tearDown()
{
Artisan::call('migrate:reset');
parent::tearDown();
}
}
L'exécution de phpunit
échoue avec une erreur:
$ phpunit PHPUnit 5.7.5 par Sebastian Bergmann et contributeurs.
E 1/1 (100%)
Temps: 2,19 secondes, mémoire: 12,00 Mo
Il y a eu 1 erreur:
1) CourseTypesTest :: test_list_course_types ReflectionException: la classe TestDatabaseSeeder n'existe pas
D:\www\learn-laravel\my-folder-api\vendor\laravel\framework\src\Illuminate\Container\Container.php: 749 D:\www\learn-laravel\my-folder-api\vendor\laravel\framework\src\Illuminate\Container\Container.php: 644 D:\www\learn-laravel\my-folder-api\vendor\laravel\framework\src\Illuminate\Foundation\Application.php: 709 D:\www\learn-laravel\my-folder-api\vendor\laravel\framework\src\Illuminate\Database\Console\Seeds\SeedCommand.php: 74 D:\www\learn-laravel\my-folder-api\vendor\laravel\framework\src\Illuminate\Database\Console\Seeds\SeedCommand.php: 63 D:\www\learn-laravel\my-folder-api\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php : 2292 D:\www\learn-laravel\my-folder-api\vendor\laravel\framework\src\Illuminate\Database\Console\Seeds\SeedCommand.php: 64 D:\www\learn-laravel\my-folder -api\vendor\laravel\framework\src\Illuminate\Container\Container.php: 508 D:\www\learn-laravel\my-folder-api\vendor\laravel\framework\src\Illuminate\Console\Command.php : 169 D:\www\learn-laravel\my-fol der-api\vendor\symfony\console\Command\Command.php: 254 D:\www\learn-laravel\my-folder-api\vendor\laravel\framework\src\Illuminate\Console\Command.php: 155 D :\www\learn-laravel\my-folder-api\vendor\symfony\console\Application.php: 821 D:\www\learn-laravel\my-folder-api\vendor\symfony\console\Application.php: 187 D:\www\learn-laravel\my-folder-api\vendor\symfony\console\Application.php: 118 D:\www\learn-laravel\my-folder-api\vendor\laravel\framework\src\Illuminate\Console\Application.php: 107 D:\www\learn-laravel\my-folder-api\vendor\laravel\framework\src\Illuminate\Foundation\Console\Kernel.php: 218 D:\www\learn- laravel\my-folder-api\vendor\laravel\framework\src\Illuminate\Support\Facades\Facade.php: 237 D:\www\learn-laravel\my-folder-api\tests\rest\CourseTypesTest.php: 17
LES ERREURS! Tests: 1, assertions: 0, erreurs: 1.
Le problème est l'espace vide dans votre argument --class. Si vous examinez attentivement le tableau '--class' => 'TestDatabaseSeeder '
il y a de l'espace à la fin ... c'est le problème. Remplacez-le par '--class' => 'TestDatabaseSeeder'
et cela devrait fonctionner correctement.
La DatabaseSeeder
peut être instanciée seule, et sa méthode call
est publique.
Tout ce que vous devez faire dans votre classe CourseTypesTest
serait
(new DatabaseSeeder())->call(TestDatabaseSeeder::class);
Ou vous pouvez utiliser l'assistant app
de Laravel comme suit
app(DatabaseSeeder::class)->call(TestDatabaseSeeder::class);
Depuis la version 5.8, vous pouvez faire quelque chose comme:
// Run the DatabaseSeeder...
$this->seed();
// Run a single seeder...
$this->seed(OrderStatusesTableSeeder::class);