Как запустить базу данных в методе setupBeforeClass в модульном тесте Laravel 4?
у меня есть тестовый класс Laravel 4 с рядом тестов, для которых я хочу засеять свою базу данных перед запуском тестов. Использование функции setup () для повторного заполнения для каждого теста занимает слишком много времени. Однако, когда я пытаюсь заполнить статическую функцию setupBeforeClass() или конструктор, я, очевидно, не могу использовать метод $this->seed ().
но я также не могу использовать программные команды Artisan, потому что, когда я это делаю, я получаю следующую ошибку:PHP Fatal error: Class 'Artisan' not found in <test class name>
здесь код, который я хотел бы использовать для seed:
Artisan::call('migrate:refresh');
Artisan::call('db:seed', array('--class'=>'TestSeeder');
пожалуйста, дайте мне знать, как я могу засеять свою базу данных один раз за тест класс, а не на тест случае
4 ответов
"импровизированный", но довольно чистый способ 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...
}
...это мое решение, и оно кажется достаточно простым и отлично работает, решая проблемы производительности заполнения и восстановления структуры БД перед каждым тестовым запуском. Но помните, что "правильный" способ сделать тестирование, что дает вам наибольшее доверие методы тестов не становятся тонко взаимозависимыми в способах скрытия ошибок, заключается в повторном засеве вашей БД перед каждым методом тестирования, поэтому просто поместите код посева в plain setUp
Если вы можете позволить себе штраф за производительность (для моих тестовых случаев я не мог себе этого позволить, но ymmv...).
У меня была такая же проблема и решена с этим
passthru('cd ' . __DIR__ . '/../.. & php artisan migrate:refresh & db:seed --class=TestSeeder');
Это пока лучшее решение, которое я нашел
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 **/ }
вы можете сделать сейчас:
protected function setUp()
{
parent::setUp();
$this->seed();
}
в своем setUp()
метод тестирования.
на seed()
метод принимает в качестве параметра класс сеялки.
public function seed($class = 'DatabaseSeeder')
{
$this->artisan('db:seed', ['--class' => $class]);
return $this;
}