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

ral*_*oss 11 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');
Run Code Online (Sandbox Code Playgroud)

请让我知道我可以为每个测试一次种子我的数据库,而不是每次测试案例

Neu*_*onQ 27

实现类似效果的"即兴"但相当干净的imho方法是这样做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...
}
Run Code Online (Sandbox Code Playgroud)

...这是我的解决方案,看起来很简单并且工作正常,解决了每次测试运行之前播种和重建db结构的性能问题.但是请记住,进行测试"正确"方法,让您最有信心,您的测试方法不会在错误隐藏方式中产生微妙的相互依赖性,是在每个测试方法之前重新种子数据库,所以只需放置种子代码在平原setUp,如果你能负担得起的性能损失(对于我的测试情况下,我买不起,但情况因人而异...).

  • 一旦所有测试完成,你如何处理重置数据库? (3认同)

小智 5

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

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


Tas*_*ima 5

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

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