如何在PHPUnit测试setUp中运行Laravel数据库填充器?

31

我正在尝试在某些PHPUnit测试用例中在每次测试之前重新创建数据库。我正在使用Laravel 5.3。这是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();
    }
}

在运行phpunit时出错:

$ phpunit PHPUnit 5.7.5 by Sebastian Bergmann and contributors.

E 1 / 1 (100%)

Time: 2.19 seconds, Memory: 12.00MB

发生了1个错误:

1)CourseTypesTest::test_list_course_types ReflectionException:类 TestDatabaseSeeder不存在

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-folder-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

错误!测试:1,断言:0,错误:1。

但是这个类是存在的:
database/seeds中的TestDatabaseSeeder

4个回答

35

自版本5.8起,您可以执行以下操作:

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

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

查看文档


如何运行多个seeder?只需要多次单独调用还是我可以将数组传递给 $this->seed() ? - Ponzio Pilato

21

DatabaseSeeder可以单独实例化,其call方法是公共的。

在您的CourseTypesTest类中,您只需要

(new DatabaseSeeder())->call(TestDatabaseSeeder::class);

或者您可以像下面这样使用Laravel的app助手函数。
app(DatabaseSeeder::class)->call(TestDatabaseSeeder::class);

13

问题在于你的 --class 参数中有空格。如果你仔细观察数组 '--class' => 'TestDatabaseSeeder ',会发现末尾有一个空格...这就是问题所在。将其更改为 '--class' => 'TestDatabaseSeeder',应该就可以正常工作了。


恭喜!空格..太棒了 :) - gandra404
如果您只想迁移一次数据,请查看此链接:https://dev59.com/gGEh5IYBdhLWcg3w5283 - pablorsk

-3

enter image description here

你可以尝试这种方式。当你运行测试时,可以执行这个命令。


4
请在答案正文中包含源代码,而不是使用图像。 - Dwight

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接