gpt4 book ai didi

laravel - 如何使用内存数据库中的 sqlite 在 laravel 5.5 中运行单元测试

转载 作者:行者123 更新时间:2023-12-02 18:53:18 24 4
gpt4 key购买 nike

我设置了一个测试数据库:

phpunit.xml:

<phpunit>
<!... other stuff ...>
<php>
<env name="APP_ENV" value="testing"/>
<env name="CACHE_DRIVER" value="array"/>
<env name="SESSION_DRIVER" value="array"/>
<env name="QUEUE_DRIVER" value="sync"/>
<env name="DB_CONNECTION" value="sqlite_testing"/>
</php>
</phpunit>

database.php:

'connections' => [
'sqlite_testing' => [
'driver' => 'sqlite',
'database' => ':memory:',
'prefix' => '',
],

DatabaseSeeder.php

<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
$this->call([
MyTableSeeder::class
]);
}
}

MyTableSeeder.php:

<?php

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use App\My\Model;

class MyTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
DB::table('model')->insert([
'id' => 1,
'created_at' => \Carbon\Carbon::now(),
'updated_at' => \Carbon\Carbon::now()
]);

/**
* create random data
*/
factory(Model::class, 50)->create();
}
}

ModelFactory.php:

<?php

use Faker\Generator as Faker;

$factory->define(\App\My\Model::class, function (Faker $faker) {
return [
'id' => $faker->unique()->randomNumber(),
'created_at' => $faker->dateTime('now'),
'updated_at' => $faker->dateTime('now')
];
});

MyTest.php:

<?php

namespace Tests\Unit;

use App\My\Model;
use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;

class MyTest extends TestCase
{
use RefreshDatabase;

public function testGettingModel() {
var_dump(Model::all()); // <-- returns a collection without any items

$model = Model::where('id', 1)->first();

$this->assertEquals('1', $model->id); // <-- trying to get property of non-object
}
}

因此,在测试运行时,数据库似乎是由该特征迁移的,但没有播种,因此没有返回任何内容。但是,文档没有说明(或者我找不到)如何在测试时为数据库播种。它说明了如何通过运行“php artisan db:seed”来手动播种,但这显然在测试中不起作用,因为测试后数据库不再存在。而且我无法手动运行它,因为测试之前数据库不存在。这也会使测试变得不切实际。

一些示例说明在测试的设置方法中进行测试之前运行播种,如下所示:

public function setUp() {
Artisan::call('db:seed');
}

但是包含此语句会导致错误:

RuntimeException : A facade root has not been set. (in /vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php:218)

或者像这样运行它:

public function setUp()
{
$this->artisan('db:seed');
}

导致:

Error : Call to a member function call() on null (in /vendor/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/InteractsWithConsole.php:18)

我实际上该如何做到这一点?任何地方都有完整的工作示例吗?到目前为止我找不到任何:(

最佳答案

您必须在setUp方法中调用$this->seed();。但需要确保之前调用了parent的setUp方法,否则会失败。

<?php

namespace Tests\Unit;

use App\My\Model;
use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;

class MyTest extends TestCase
{
use RefreshDatabase;

public function setUp()
{
parent::setUp();
$this->seed();
}

public function testGettingModel() {
$model = Model::where('id', 1)->first();
$this->assertEquals('1', $model->id); // will assert to true if the id actually exists
}
}

关于laravel - 如何使用内存数据库中的 sqlite 在 laravel 5.5 中运行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48863645/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com