为啥 Laravel PHPUnit 内存测试会播种我的主数据库?

Posted

技术标签:

【中文标题】为啥 Laravel PHPUnit 内存测试会播种我的主数据库?【英文标题】:Why is Laravel PHPUnit in-memory test seeding my main db?为什么 Laravel PHPUnit 内存测试会播种我的主数据库? 【发布时间】:2017-01-16 02:31:56 【问题描述】:

[更新] 如果我使用查询生成器(即 DB::table()),测试似乎可以在内存中找到,但在使用 Eloquent 时使用主表。还是没有提示。

我已按照以下 2 个教程进行内存测试:

testing-like-a-boss-in-laravel-models

laravel-setting-up-an-in-memory-test-database

我首先尝试迁移/播种一个在我的主 mysql 数据库中不存在的表。一切都很好,没有在mysql中创建表并且测试断言成功。

然后我尝试使用真实表进行迁移/播种/内存测试,发现它是在我的主 mysql 数据库中播种的。

新尝试的内存测试。需要帮助: 1.不知道为什么我的主数据库被触动了。 2.如何验证内存数据库是否已填充?有什么方法可以浏览吗?

主要步骤如下:

在 app/config/testing/database.php

'default' => 'testing',

'testing' => array(
            'driver'   => 'sqlite',
            'database' => ':memory:',
            'prefix'   => '',
        )

在 phpunit.xml 中,添加了这个:

<php>
        <env name="APP_ENV" value="testing"/>
        <env name="CACHE_DRIVER" value="array"/>
        <env name="SESSION_DRIVER" value="array"/>
        <env name="QUEUE_DRIVER" value="sync"/>
        <env name="DB_CONNECTION" value="testing"/>
    </php>

在TestCase类中:

public function createApplication()
    
        $unitTesting = true;
        $testEnvironment = 'testing';
        return require __DIR__.'/../../bootstrap/start.php';
    

在我的测试课中:

public function setUp()
    
        parent::setUp();
        Artisan::call('migrate');
        Artisan::call('db:seed', ['--class' => 'DatabaseSeeder', '--database' => 'testing']);
    

【问题讨论】:

【参考方案1】:

function setUp() 在每次测试之前运行。如果您查看setUp,您可以看到迁移和种子。如果您在设置中删除 Artisan::call('db:seed),您的数据库将在您的班级的每个测试中都没有种子数据。

那么,这是你的新代码:

public function setUp()

    parent::setUp();
    Artisan::call('migrate');
    // Artisan::call('db:seed', ['--class' => 'DatabaseSeeder', '--database' => 'testing']);

【讨论】:

我认为这并不能回答问题。 @aiiwa 需要运行带有数据种子的测试用例,但他不希望在运行测试用例后将数据保存到主数据库中。

以上是关于为啥 Laravel PHPUnit 内存测试会播种我的主数据库?的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel PHPUnit 测试中使用内存中的 SQLite

为啥在 Laravel 中使用 PHPUnit 的函数“link_to”没有返回值?

PHPUnit 似乎没有运行 Laravel 迁移

使用 phpunit.xml、.env.dusk.local 和 sqlite 内存数据库设置 Laravel 5.4 和 Dusk

如何使用内存数据库中的 sqlite 在 laravel 5.5 中运行单元测试

laravel 4 无法让 phpunit 测试工作