当我使用laravel的`RefreshDatabase`特征

时间:2019-07-03 13:16:36

标签: php laravel codeigniter phpunit database-migration

我正在将我的应用程序从Codeigniter迁移到laravel,我们也在进行集成和单元测试。

该数据库由2个数据库组成:

  • old是原始代码点火器中使用的那个。
  • new用于codeingiter项目中不相关的其他功能。

因此,我想制作一个用于old数据库的迁移脚本,但是为了避免故障,我想为每个数据库的迁移脚本指定一个特定的文件夹。

因此,我找到了这个工具:https://github.com/Xethron/migrations-generator并通过此帮助输出:

Description:
  Generate a migration from an existing table structure.

Usage:
  migrate:generate [options] [--] [<tables>]

Arguments:
  tables                              A list of Tables you wish to Generate Migrations for separated by a comma: users,posts,comments

Options:
  -c, --connection[=CONNECTION]       The database connection to use. [default: "etable_api"]
  -t, --tables[=TABLES]               A list of Tables you wish to Generate Migrations for separated by a comma: users,posts,comments
  -i, --ignore[=IGNORE]               A list of Tables you wish to ignore, separated by a comma: users,posts,comments
  -p, --path[=PATH]                   Where should the file be created?
      --defaultIndexNames             Don't use db index names for migrations
      --defaultFKNames                Don't use db foreign key names for migrations
  -h, --help                          Display this help message
  -q, --quiet                         Do not output any message
  -V, --version                       Display this application version
      --ansi                          Force ANSI output
      --no-ansi                       Disable ANSI output
  -n, --no-interaction                Do not ask any interactive question
      --env[=ENV]                     The environment the command should run under
  -tp, --templatePath[=TEMPLATEPATH]  The location of the template for this generator
  -v|vv|vvv, --verbose                Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

我可以使用以下命令序列来为迁移脚本创建专用文件夹:

mkdir -p ./database/migration/old
php artisan migrate:generate -c old -p ./database/migration/old

通过工匠,我可以通过以下方式运行迁移:

php artisan migrate -c old -p ./database/migration/old

因此,我可以使用laravel提供的解决方案:

namespace Tests\Feature;

use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;

class ExampleTest extends TestCase
{
    use RefreshDatabase;

    /**
     * A basic functional test example.
     *
     * @return void
     */
    public function testBasicExample()
    {
      // Do some fancy stuff here
    }
}

但是在使用Illuminate\Foundation\Testing\RefreshDatabase时如何为要参与测试的数据库的迁移脚本指定指定的文件夹?

1 个答案:

答案 0 :(得分:0)

我看到这个问题有点老了,但是如果有人在寻找这个问题的答案,这对我有用。您可以通过对应用程序进行一些调整来完成您想做的事情。

当我尝试对带有migrations子文件夹的应用程序进行测试时发现的两个问题是,在构建应用程序以及通过RefreshDatabase特性刷新数据库时,子文件夹中的迁移未执行。 / p>

要使其正常工作,我必须:

  1. 修改我的CreatesApplication特征以在创建应用程序后在子文件夹中运行迁移。
  2. 创建自己的RefreshDatabase特征,将其附加在包含的RefreshDatabase特征上。

RefreshDatabase特征

  • 在tests / Traits目录下创建一个新文件(我必须创建此文件),名为RecursiveRefreshDatabase.php 该文件包含以下代码:
<?php

namespace Tests\Traits;

use Illuminate\Contracts\Console\Kernel;
use Illuminate\Foundation\Testing\RefreshDatabase;

trait RecursiveRefreshDatabase {
    use RefreshDatabase;

    /**
     * Refresh the in-memory database.
     *
     * @return void
     */
    protected function refreshInMemoryDatabase()
    {
        $this->artisan('migrate');
        // 'database/migrations/sub-folder’ would probably be ‘database/migrations/old’ in the case of the OP
        $this->artisan('migrate', ['--path' => 'database/migrations/sub-folder’]);

        $this->app[Kernel::class]->setArtisan(null);
    }
}
  • 在测试中替换
use Illuminate\Foundation\Testing\RefreshDatabase;

使用

use Tests\Traits\RecursiveRefreshDatabase as RefreshDatabase;
  • 注意:在本示例中,我将覆盖refreshInMemoryDatabase方法,但是如果您不使用内存数据库进行测试,则可能需要覆盖另一种方法。

修改CreatesApplication.php

  • 修改文件tests/CreatesApplication.php,以调用子文件夹迁移createApplication(),如下所示
public function createApplication()
{
    $app = require __DIR__ . ‘/../../bootstrap/app.php’;

    $app->make(Kernel::class)->bootstrap();

    $this->afterApplicationCreated(function () {
        // 'database/migrations/sub-folder’ would probably be ‘database/migrations/old’ in the case of the OP
        $this->artisan(‘migrate’, [‘—path’ => ‘database/migrations/sub-folder’]);
    });

    return $app;
}



这些更改对我有用,并使我的测试再次起作用。让我知道它是否对您有用!