Как запустить базу данных в методе 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;
}