首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel移相器如何使用不同的迁移进行测试

问Laravel移相器如何使用不同的迁移进行测试
EN

Stack Overflow用户
提问于 2020-01-15 13:28:40
回答 3查看 4.8K关注 0票数 4

我正试图在Laravel中设置测试,但我想运行与通常运行的迁移不同的迁移。

我运行的用于启动数据库的迁移从生产环境中导入数据。

对于测试,我想使用一个不同的数据库,称为" test ",我希望用测试数据来填充这个测试数据库,而不是生产数据。

我添加了一个到config/database.php的“测试”连接,它使用"test“数据库:

代码语言:javascript
复制
'connections' => [

        'mysql' => [
            'database' => env('DB_DATABASE', 'forge'),
            ...
        ],

        'testing' => [
            'database' => 'test',
            ...
        ],
],

我设置了phpunit.xml来使用这个“测试”连接:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<phpunit ...>
    ...
    <php>
        <env name="DB_CONNECTION" value="testing"/>
        ...
    </php>
</phpunit>

现在,我想用测试数据初始化这个“测试”数据库,使用与默认情况不同的文件夹迁移。

我可以使用像这样的正常迁移:

代码语言:javascript
复制
<?php

namespace Tests;

use Illuminate\Foundation\Testing\TestCase as BaseTestCase;
use Illuminate\Foundation\Testing\DatabaseMigrations;

abstract class TestCase extends BaseTestCase
{
    use DatabaseMigrations;

    public function setUp(): void
    {
        parent::setUp();
        $this->seed();
    }
}

但这使用默认文件夹database/migrations。我想把测试迁移放到tests/database/migrations文件夹中。

有办法让use DatabaseMigrations;使用来自另一个文件夹的迁移吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-01-15 14:07:19

在迁移运行之前,您可能需要在runDatabaseMigrations特性中重写DatabaseMigrations方法,并从那里设置应用程序的数据库路径。

runDatabaseMigrations方法的最终结果可能如下所示:

代码语言:javascript
复制
use DatabaseMigrations { runDatabaseMigrations as runMigration; }

    public function runDatabaseMigrations()
    {
        $this->app->useDatabasePath(base_path('tests/database')); //example path
//        dump($this->app->databasePath());
        $this->runMigration();
    }

也可以在boot提供程序的AppService方法中设置:

代码语言:javascript
复制
    if (config('app.env') === 'testing') { //Laravel automatically set env to 'testing' when running test
        $this->app->useDatabasePath(base_path('tests/database'));
    }

迁移将寻找一个名为“迁移”的“测试/数据库”的子文件夹。

PS:如果您在默认的database文件夹中有其他代码或文件夹,则会产生副作用。例如,在这个测试类中找不到您的工厂类.

票数 8
EN

Stack Overflow用户

发布于 2020-01-15 14:22:52

手工迁移有一个路径选项,您必须使自己的特性具有类似的功能。我在想像这样的事。

代码语言:javascript
复制
trait PathDatabaseMigrations {

    public function runDatabaseMigrations()
    {
        // optimal 
        $path = 'tests/database/migrations';

        $this->artisan('migrate:fresh', ['--path' => $path,]);

        $this->app[Kernel::class]->setArtisan(null);

        $this->beforeApplicationDestroyed(function () {
            $this->artisan('migrate:rollback', ['--path' => $path,]);

            RefreshDatabaseState::$migrated = false;
        });
    }
}
票数 1
EN

Stack Overflow用户

发布于 2022-03-17 23:33:46

RefreshDatabase特性有一个名为migrateUsing的方法,它将重载它在运行迁移时使用的参数。通过将单个测试作为--path参数传入到迁移中,我更改为单个测试的特定测试迁移文件。

代码语言:javascript
复制
namespace Tests\Unit;

use Tests\TestCase;
use App\Models\Traits\HasUuid;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Testing\RefreshDatabase;

class HasUuidTest extends TestCase
{
    use RefreshDatabase;

    protected function migrateUsing()
    {
        return [
            '--path' => 'tests/migrations/2022_03_15_220516_create_test_uuid_table.php'
        ];
    }

    public function test_has_uuid()
    {
        $model = new TestUuid;
        $this->assertEmpty($model->id);
        $model->save();
        $this->assertNotEmpty($model->id);
    }
}

class TestUuid extends Model
{
    use HasUuid;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59752426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档