为了账号安全,请及时绑定邮箱和手机立即绑定

Laravel phpunit 如何使用 diffent migrations 进行测试

Laravel phpunit 如何使用 diffent migrations 进行测试

PHP
收到一只叮咚 2022-08-05 09:45:01
我正在尝试在Laravel中设置测试,但我想运行与通常运行的迁移不同的迁移。我为启动数据库而运行的迁移从生产环境中导入数据。对于测试,我想使用一个名为“test”的不同数据库,并且我想用测试数据填充这个测试数据库,而不是生产数据。我添加了一个“测试”连接,该连接使用“test”数据库:config/database.php'connections' => [        'mysql' => [            'database' => env('DB_DATABASE', 'forge'),            ...        ],        'testing' => [            'database' => 'test',            ...        ],],我设置了这个“测试”连接:phpunit.xml<?xml version="1.0" encoding="UTF-8"?><phpunit ...>    ...    <php>        <env name="DB_CONNECTION" value="testing"/>        ...    </php></phpunit>现在,我想使用测试数据初始化此“测试”数据库,使用与默认文件夹不同的文件夹进行迁移。我可以像这样使用正常的迁移:<?phpnamespace 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/migrationstests/database/migrations有没有办法让使用来自另一个文件夹的迁移?use DatabaseMigrations;
查看完整描述

3 回答

?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

在迁移运行之前,你可能需要覆盖 trait 中的方法,并从那里设置应用的数据库路径。runDatabaseMigrationsDatabaseMigrations


该方法可能最终如下所示:runDatabaseMigrations


use DatabaseMigrations { runDatabaseMigrations as runMigration; }


    public function runDatabaseMigrations()

    {

        $this->app->useDatabasePath(base_path('tests/database')); //example path

//        dump($this->app->databasePath());

        $this->runMigration();

    }

或者,您可以在应用服务提供商的方法中设置:boot


    if (config('app.env') === 'testing') { //Laravel automatically set env to 'testing' when running test

        $this->app->useDatabasePath(base_path('tests/database'));

    }

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


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


查看完整回答
反对 回复 2022-08-05
?
大话西游666

TA贡献1817条经验 获得超14个赞

工匠迁移有一个路径选项,你必须做出自己的特质才能具有类似的功能。我在想这样的事情。


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;

        });

    }

}


查看完整回答
反对 回复 2022-08-05
?
HUH函数

TA贡献1836条经验 获得超4个赞

该 trait 具有一个调用的方法,该方法将重载它在运行迁移时使用的参数。我更改为单个测试的特定测试迁移文件,方法是将其作为迁移参数传入。RefreshDatabasemigrateUsing--path


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;

}


查看完整回答
反对 回复 2022-08-05
  • 3 回答
  • 0 关注
  • 104 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信