Laravel Model Factory无需连接数据库

use*_*810 13 php testing unit-testing laravel lumen

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

为什么Model Factory需要连接到数据库?这些测试必须传递CI环境而不配置数据库.

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

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

我正在使用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);
        // […];
    }
}
Run Code Online (Sandbox Code Playgroud)

我的模型工厂

$factory->defineAs(Model::class, 'base', function ($faker) {
    return [
        '_id' => $faker->md5,
        'email' => $faker->email,
    ];
});
Run Code Online (Sandbox Code Playgroud)

需要数据库连接的测试:

class ModelTransformerTest extends TestCase
{
    public function testTransformMinimalModelData()
    {
        $model = factory(App\Model::class, 'base')->make();
        // […];
    }
}
Run Code Online (Sandbox Code Playgroud)

完整堆栈跟踪:

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
Run Code Online (Sandbox Code Playgroud)

Cam*_*ilo 1

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

您可以自行查看源代码