【问题标题】:How to skip certain migration files when using RefreshDatabase trait使用 RefreshDatabase 特征时如何跳过某些迁移文件
【发布时间】:2021-10-22 16:07:30
【问题描述】:

我正在为我的 Laravel 项目编写一些测试。

我的 TestCase 文件使用 RefreshDatabase 特征,据我所知,它会在每次运行测试时运行我的所有迁移。

我在测试环境中使用 SQLite,在开发环境中使用 MySQL。

现在的问题是我最近创建了一个执行一些原始 MySQL 代码的迁移文件。

当我现在运行测试时,我收到以下错误

SQLSTATE[HY000]: General error: 1 near "OR": syntax error

SQLite 似乎不支持 CREATE OR REPLACE 语法(见下面我的代码)。

导致问题的迁移文件只是创建了一个视图表,因此我的测试不需要它(至少目前是这样)。

可能的解决方案?

我想我的主要选择是以下之一:

使用MySQL作为测试环境

跳过任何执行 MySQL 代码的迁移文件。但是怎么做呢?

没关系,但这是导致问题的 MySQL 代码:

    CREATE OR REPLACE VIEW view_projects
    AS
    SELECT
        projects.title AS title,
        projects.description AS description,
        _project_types.title AS type,
        _project_timelines.title AS projected_timeline,
        users.id AS manager_id,
        users.username AS manager_username,
        projects.planned_start_date AS start_date,
        projects.planned_end_date AS end_date
    FROM
        projects
        LEFT JOIN users ON projects.manager = users.id
        LEFT JOIN _project_types ON projects.type = _project_types.id
        LEFT JOIN _project_timelines ON projects.projected_timeline = _project_timelines.id;
");

【问题讨论】:

  • 这不是答案 - 但试试这个。它和 SQLIte 一样快,但可以解决所有问题,就像你遇到的 medium.com/@2618094/…

标签: mysql laravel sqlite


【解决方案1】:

在您的迁移文件中,您将能够测试您所在的环境。在PHPunit 中运行时,您的应用环境是"testing"

因此,在您的迁移中添加以下内容。使用 app() 帮助器来测试您所在的环境。当在 testing 环境中运行时,这将跳过迁移。

public function up() {
    if (app()->environment('testing')) {
        return ;
    }

    ... your code
}

public function down() {
    if (app()->environment('testing')) {
        return ;
    }

    ... your code
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-14
    • 2012-08-21
    • 2018-03-12
    • 2013-01-25
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 2020-05-24
    相关资源
    最近更新 更多