Laravel 5.5 PHPunit Test - "Корень фасада не установлен".
Когда я делаю попытку / поймать DB::Connection()->getPdo();
, Я получаю ошибку Корень фасада не был установлен. Я считаю, что это происходило с Schema
фасады тоже, прежде чем я попытался добавить попробовать / поймать. Каталог tests, конечно, находится за пределами каталога приложения, и у меня есть ощущение, что это как-то связано с этим, но мне не удалось это выяснить.
Вот тестовый класс, где это происходит:
<?php
namespace Tests\Models;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\DB;
use App\Models\Discussion;
use App\User;
use Business\Database\Model;
use Illuminate\Database\Schema\Blueprint;
use Tests\TestCase;
class DiscussionModelTest extends TestCase
{
/**
* Create the tables this model needs for testing.
*/
public static function setUpBeforeClass()
{
try {
DB::connection()->getPdo();
} catch(\Exception $e) {
die($e->getMessage());
}
Schema::create('discussions', function (Blueprint $table) {
$table->integer('id');
$table->integer('user_id');
$table->foreign('user_id')->references('id')->on('users');
});
Schema::create('users', function (Blueprint $table) {
$table->integer('id');
});
}
}
3 ответа
Дело в том, что вы не можете сделать это в setUpBeforeClass, потому что многие вещи выполняются в setUp
метод. Если вы посмотрите на этот порядок запуска вы увидите setUpBeforeClass
запускается раньше setUp
Метод и класс TestCase делает много вещей в setUp
метод. Это выглядит так:
protected function setUp()
{
if (! $this->app) {
$this->refreshApplication();
}
$this->setUpTraits();
foreach ($this->afterApplicationCreatedCallbacks as $callback) {
call_user_func($callback);
}
Facade::clearResolvedInstances();
Model::setEventDispatcher($this->app['events']);
$this->setUpHasRun = true;
}
Итак, что вы должны сделать, это создать собственный setUp
а также tearDown
методы с вашей собственной реализацией, такие как это:
protected function setUp()
{
parent::setUp();
// your code goes here
}
protected function tearDown()
{
parent::tearDown();
// your code goes here
}
Вы не должны этого делать, потому что функциональный тест расширит класс TestCase в вашем каталоге тестов вместо PHPUnit.
Удалять:
use PHPUnit\Framework\TestCase;
И замените его на:
use Tests\TestCase;
Для всех, кому интересно, какой другой метод я нашел для работы с использованием капсулы, вот код. это будет работать в обоих setUpBeforeClass()
а также setUp()
, Это может и должно быть более абстрактным, но это суть.
use Illuminate\Database\Capsule\Manager as Capsule;
class DiscussionModelTest extends TestCase
{
/**
* Create the tables this model needs for testing.
*/
public static function setUpBeforeClass()
{
$capsule = new Capsule;
$capsule->addConnection([
'driver' => 'sqlite',
'database' => ':memory:',
'prefix' => '',
]);
$capsule->setAsGlobal();
$capsule->bootEloquent();
Capsule::schema()->create('discussions', function (Blueprint $table) {
$table->integer('id');
$table->integer('user_id');
$table->foreign('user_id')->references('id')->on('users');
});
Capsule::schema()->create('users', function (Blueprint $table) {
$table->integer('id');
});
// Seed the faux DB
Model::unguard();
User::create([
'id' => 13
]);
Discussion::create([
'id' => 5,
'user_id' => 13
]);
}
}