Laravel 模型工厂没有连接到数据库

Posted

技术标签:

【中文标题】Laravel 模型工厂没有连接到数据库【英文标题】:Laravel Model Factory without connection to database 【发布时间】:2016-12-17 09:07:17 【问题描述】:

我想在一些 phpUnit 测试中使用 Laravel 的模型工厂。我唯一想做的就是创建一个模型实例而不将其保存到数据库中。

为什么模型工厂需要连接到数据库?这些测试必须在没有配置数据库的 CI 环境中通过。

当我通过new App\Model($dataArray) 手动创建模型时,测试通过并且不需要连接。

我在其他地方使用模型工厂,所以我想在测试中重用它,以避免代码重复。

我正在使用 MongoDB 和 jenssegers/laravel-mongodb 库,但我猜这无关紧要 - 在纯 Eloquent 中,例如mysql 数据库,问题应该是一样的。

在没有数据库的情况下工作的测试:

class ModelTransformerTest extends TestCase

    public function testTransformMinimalModelData()
    
        $data = [
            '_id' => $faker->md5,
            'email' => $faker->email,
        ];

        $model = new App\Model($data);
        // […];
    

我的模型工厂

$factory->defineAs(Model::class, 'base', function ($faker) 
    return [
        '_id' => $faker->md5,
        'email' => $faker->email,
    ];
);

需要连接数据库的测试:

class ModelTransformerTest extends TestCase

    public function testTransformMinimalModelData()
    
        $model = factory(App\Model::class, 'base')->make();
        // […];
    

完整的堆栈跟踪:

Error: Class 'MongoDB\Driver\Manager' not found

app\vendor\mongodb\mongodb\src\Client.php:56
app\vendor\jenssegers\mongodb\src\Jenssegers\Mongodb\Connection.php:147
app\vendor\jenssegers\mongodb\src\Jenssegers\Mongodb\Connection.php:37
app\vendor\jenssegers\mongodb\src\Jenssegers\Mongodb\MongodbServiceProvider.php:27
app\vendor\illuminate\database\DatabaseManager.php:173
app\vendor\illuminate\database\DatabaseManager.php:68
app\vendor\illuminate\database\Eloquent\Model.php:3282
app\vendor\illuminate\database\Eloquent\Model.php:3248
app\vendor\jenssegers\mongodb\src\Jenssegers\Mongodb\Eloquent\Model.php:523
app\vendor\jenssegers\mongodb\src\Jenssegers\Mongodb\Eloquent\Model.php:284
app\vendor\illuminate\database\Eloquent\Model.php:443
app\vendor\illuminate\database\Eloquent\Model.php:281
app\vendor\illuminate\database\Eloquent\FactoryBuilder.php:142
app\vendor\illuminate\database\Eloquent\Model.php:2286
app\vendor\illuminate\database\Eloquent\FactoryBuilder.php:143
app\vendor\illuminate\database\Eloquent\FactoryBuilder.php:106
app\tests\phpunit\Transformers\ModelTransformerTest.php:25
\php\pear\PHPUnit\TextUI\Command.php:176
\php\pear\PHPUnit\TextUI\Command.php:129

【问题讨论】:

您可以为此使用 SQLite。 Laravel 提供了在内存中创建 SQLite DB 的选项。所以从技术上讲,你有一个数据库,但它不会填充你的 MongoDB 或 MySQL 等。一旦测试完成,数据库就会从内存中删除 【参考方案1】:

您是否尝试使用 DatabaseTransactions

例如

use Illuminate\Foundation\Testing\DatabaseTransactions;
class ModelTransformerTest extends TestCase

    use DatabaseTransactions;

【讨论】:

【参考方案2】:

我通常会创建一个类似的测试数据库并在该数据库上运行所有测试。

它确保您的测试数据库类型与生产数据库类型相同,并且您不会接触生产数据库来运行测试。

【讨论】:

【参考方案3】:

我认为目前这是不可能的。 make() 方法调用 newModelInstance() 尝试设置数据库连接。

您可以自己查看source code。

【讨论】:

以上是关于Laravel 模型工厂没有连接到数据库的主要内容,如果未能解决你的问题,请参考以下文章

Laravel - 尝试将项目连接到数据库的问题

如何将.net控制台应用程序客户端连接到Azure数据工厂

我不知道如何在Laravel中将表连接到另一个表

Laravel 5.1 - 连接到 MySQL 数据库 (MAMP)

无法连接到 laravel 5.6 中的数据库 xampp

我的 Laravel 项目无法连接到 XAMPP 数据库