Laravel模型工厂,无需连接数据库 [英] Laravel Model Factory without connection to database

查看:82
本文介绍了Laravel模型工厂,无需连接数据库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I would like to use Laravel's Model Factory in some PHPUnit tests. The only thing I want to do is make a Model instance without saving it to database.

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

Why the Model Factory needs connection to database? These tests must pass on CI environment without configured database.

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

When I create Model manually by new App\Model($dataArray), tests pass and the connection is not needed.

我在其他地方使用Model Factory,所以我想在测试中重用它,以避免代码重复.

I am using Model Factory in other places, so I would like to reuse it in that tests, to avoid code duplication.

我正在使用MongoDB和 jenssegers/laravel-mongodb 库,但我猜是这样没关系-纯属口才,例如MySQL数据库,问题将是相同的.

I am using MongoDB and jenssegers/laravel-mongodb library, but I am guessing that it has no matter - in pure Eloquent and e.g. MySQL database, the issue would be the same.

在没有数据库的情况下可以运行的测试:

Test that works without database:

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,
    ];
});

需要数据库连接的测试:

Test that needs database connection:

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

推荐答案

您是否尝试使用 DatabaseTransactions ?

例如

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

这篇关于Laravel模型工厂,无需连接数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆