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,如果你能负担得起的性能损失(对于我的测试情况下,我买不起,但情况因人而异...).
小智 5
我遇到了同样的问题并解决了这个问题
passthru('cd ' . __DIR__ . '/../.. & php artisan migrate:refresh & db:seed --class=TestSeeder');
Run Code Online (Sandbox Code Playgroud)
这是迄今为止我发现的最好的解决方案
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)
| 归档时间: |
|
| 查看次数: |
5240 次 |
| 最近记录: |