问题描述
我想在某些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模型工厂,无需连接数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!