我有一个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');
请告诉我如何在每个测试类而不是每个测试案例
中为我的数据库播种一次答案 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}