如何在Laravel 4单元测试中的setupBeforeClass方法中为我的数据库播种?

时间:2014-02-19 22:14:40

标签: database testing laravel-4

我有一个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');

请告诉我如何在每个测试而不是每个测试案例

中为我的数据库播种一次

5 个答案:

答案 0 :(得分:24)

实现类似效果的“即兴”但相当干净的方法是在setUp中执行此操作,但只运行一次(类似于{{1}这样做:

setupBeforeClass

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

答案 1 :(得分:4)

我遇到了同样的问题,并用这个解决了

passthru('cd ' . __DIR__ . '/../.. & php artisan migrate:refresh & db:seed --class=TestSeeder');

答案 2 :(得分:2)

这是迄今为止我发现的最佳解决方案

class ExampleTest extends TestCase {
/**
 * This method is called before
 * any test of TestCase class executed
 * @return void
 */
public static function setUpBeforeClass()
{
    parent::setUpBeforeClass();
    print "\nSETTING UP DATABASE\n";
    shell_exec('php artisan migrate --seed');
}

/**
 * This method is called after
 * all tests of TestCase class executed
 * @return void
 */
public static function tearDownAfterClass()
{
    shell_exec('php artisan migrate:reset');
    print "\nDESTROYED DATABASE\n";
    parent::tearDownAfterClass();
}
/** tests goes here **/ }

答案 3 :(得分:0)

您现在可以这样做:

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

    $this->seed();
}

使用您的setUp()方法进行测试。

seed()方法将播种器类作为参数接受。

public function seed($class = 'DatabaseSeeder')
{
    $this->artisan('db:seed', ['--class' => $class]);

    return $this;
}

答案 4 :(得分:0)

此特征是重置数据库的好方法

http://speech.googleapis.com/v1/speech:recognize?key={API_KEY}