laravel phpunit 使用 RefreshDatabase 多数据库方案

我在测试类中通过引用 use DatabaseTransactions; 方式对测试数据进行回滚,
我有多个数据库连接,但他只使用默认的数据库链接。

请问怎么让他根据我的模型设置的数据库链接进行,回滚?

下面是laravel的文档
https://learnku.com/docs/laravel/5.2/testing/1134#resetting-the-database-after-each-test

**注意:**此 trait 的事务只包含默认的数据库连接。



《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

非常感谢大家的回答 我发现了一种解决方案

//添加下面这个配置即可
//db_user  db_report 是你需要回滚的数据库链接
 private $connectionsToTransact = ['db_user','db_report'];
2年前 评论
讨论数量: 2

可以尝试用下面的 trait 替换原本的 DatabaseTransactions.

不过需要改造成执行多个数据库连接。

<?php

namespace Tests\Traits;

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

trait CleanDatabase
{
    /**
     * Define hooks to migrate the database before and after each test.
     *
     * @return void
     */
    public function cleanDatabase()
    {
        if (RefreshDatabaseState::$migrated) {
            return;
        }

        if ($this->shouldSkip()) {
            return;
        }

        $this->truncateAllTable();

        $this->artisan('migrate');

        if ($this->shouldSeed()) {
            $this->artisan('db:seed');
        }

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

        RefreshDatabaseState::$migrated = true;
    }

    protected function truncateAllTable()
    {
        /**@var \Illuminate\Database\DatabaseManager $database*/
        $database = $this->app->make('db');
        $connections = $database->getConnections();

        /**@var \Brokenice\LaravelMysqlPartition\MysqlConnection $connection*/
        foreach ($connections as $connection) {
            $tableNames = $connection->getDoctrineSchemaManager()->listTableNames();
            $tableNames = $this->excludeTable($tableNames, ['migrations']);
            $connection->select('set foreign_key_checks=0');

            foreach ($tableNames as $tableName) {
                $connection->select("TRUNCATE TABLE {$tableName};");
            }

            $connection->select('set foreign_key_checks=1');
        }
        return $database;
    }

    protected function excludeTable(array $tables, array $excludeTables = [])
    {
        $tables = array_filter($tables, function ($value, $key) use ($excludeTables) {
            if (in_array($value, $excludeTables)) {
                return false;
            }
            return true;
        }, ARRAY_FILTER_USE_BOTH );

        return $tables;
    }

    /**
     * Determine if the seed task should be run when refreshing the database.
     *
     * @return bool
     */
    protected function shouldSeed()
    {
        return property_exists($this, 'seed') ? $this->seed : false;
    }

    /**
     * 是否跳过清理数据,编写测试用例时可以用于加快速度
     * @return bool
     */
    protected function shouldSkip()
    {
        return property_exists($this, 'skipClean') ? $this->skipClean : false;
    }
}
2年前 评论

非常感谢大家的回答 我发现了一种解决方案

//添加下面这个配置即可
//db_user  db_report 是你需要回滚的数据库链接
 private $connectionsToTransact = ['db_user','db_report'];
2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!