如何从 PHPUnit 测试设置运行 Laravel 数据库播种机?

Posted

技术标签:

【中文标题】如何从 PHPUnit 测试设置运行 Laravel 数据库播种机?【英文标题】:How to Run Laravel Database Seeder from PHPUnit Test setUp? 【发布时间】:2017-06-07 01:01:44 【问题描述】:

我正在尝试在某些 phpUnit 测试用例中的每次测试之前重新创建数据库。我正在使用 Laravel 5.3。这是测试用例:

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,由 Sebastian Bergmann 和贡献者编写。

E 1 / 1 (100%)

时间:2.19 秒,内存:12.00MB

有 1 个错误:

1) CourseTypesTest::test_list_course_types ReflectionException: Class 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。

但是这个类存在:

【问题讨论】:

【参考方案1】:

问题是 --class 参数中的空白。如果您仔细查看数组'--class' => 'TestDatabaseSeeder ',最后还有空间......这就是问题所在。将其更改为'--class' => 'TestDatabaseSeeder',它应该可以正常工作。

【讨论】:

恭喜!空的空间..太棒了:) 如果您希望只迁移一次数据,请查看***.com/questions/21893698/…【参考方案2】:

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

您在CourseTypesTest 课程中需要做的就是

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

或者您可以使用 Laravel 的 app 助手,如下所示

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

【讨论】:

【参考方案3】:

从 5.8 版开始,您可以:

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

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

Take a look at the documentation

【讨论】:

如何运行多个播种机?只需多次调用,或者我可以将数组传递给 $this->seed()?

以上是关于如何从 PHPUnit 测试设置运行 Laravel 数据库播种机?的主要内容,如果未能解决你的问题,请参考以下文章

按特定顺序运行 PHPUnit 测试

如何强制 PHPUnit 在跳过的测试中失败?

使用自定义框架从目录运行 PHPUnit 测试

如何让 PHPUnit 运行所有的测试?

我如何在超过 1 个网站上执行 phpunit 测试

如何运行我所有的 PHPUnit 测试?