DB::Connection()->getPdo();
でtry/catchを実行すると、エラーが発生しますファサードルートが設定されていません。Schema
ファサードで発生したと思いますtry/catchを追加する前にも。もちろん、testsディレクトリはappディレクトリの外にあり、それと関係があると感じていますが、うまくいきませんでした。
これが発生しているテストクラスは次のとおりです。
<?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');
});
}
}
多くのことがsetUp
メソッドで実行されるため、setUpBeforeClassではこれを実行できません。 この実行順序 を見ると、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
}
Capsuleを使用して動作することがわかった他の方法に興味がある人のために、ここにコードがあります。これは、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
]);
}
}