gpt4 book ai didi

database - 如何在 Laravel 4 单元测试的 setupBeforeClass 方法中植入我的数据库?

转载 作者:太空狗 更新时间:2023-10-30 01:43:01 25 4
gpt4 key购买 nike

我有一个 Laravel 4 测试类,其中包含一些测试,我想在运行测试之前为我的数据库播种。使用 setup() 函数为每个测试重新播种花费的时间太长。但是,当我尝试在静态 setupBeforeClass() 函数或构造函数中播种时,我显然不能使用 $this->seed() 方法。

但我也不能使用程序化的 Artisan 命令,因为当我这样做时,我会收到以下错误:PHP Fatal error: Class 'Artisan' not found in <test class name>.

这是我想用来播种的代码:

Artisan::call('migrate:refresh');
Artisan::call('db:seed', array('--class'=>'TestSeeder');

请告诉我如何为每个测试 class 而不是每个测试 case 播种我的数据库

最佳答案

实现类似效果的“即兴”但非常干净的恕我直言的方法是在 setUp 中执行此操作,但让它只运行一次(类似于 setupBeforeClass 所做的),如下所示:

use Illuminate\Support\Facades\Artisan;

class ExampleTest extends TestCase {

protected static $db_inited = false;

protected static function initDB()
{
echo "\n---initDB---\n"; // proof it only runs once per test TestCase class
Artisan::call('migrate');
// ...more db init stuff, like seeding etc.
}

public function setUp()
{
parent::setUp();

if (!static::$db_inited) {
static::$db_inited = true;
static::initDB();
}
}

// ...tests go here...
}

...这是我的解决方案,它看起来很简单并且工作正常,解决了在每次测试运行之前播种和重建数据库结构的性能问题。但请记住,“正确”的测试方式是在每次测试前重新植入数据库,这让您最有信心您的测试方法不会以隐藏错误的方式微妙地相互依赖方法,所以只需将播种代码放在普通的 setUp 中如果您能负担得起性能损失(对于我的测试用例,我负担不起,但是 ymmv...)。

关于database - 如何在 Laravel 4 单元测试的 setupBeforeClass 方法中植入我的数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21893698/

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