web-dev-qa-db-fra.com

Comment exécuter Laravel Database Seeder de PHPUnit Test setUp?

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.

mais cette classe existe:
TestDatabaseSeeder inside database/seeds

15
gandra404

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.

11
Bostjan

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);
13
Guillaume Boutin

Depuis la version 5.8, vous pouvez faire quelque chose comme:

// Run the DatabaseSeeder...
$this->seed();

// Run a single seeder...
$this->seed(OrderStatusesTableSeeder::class);

Jetez un œil à la documentation

5
Santi Barbat