web-dev-qa-db-ja.com

Laravel 5.5PHPunitテスト-"ファサードルートが設定されていません。"

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');
        });
    }
}
6
Justin Anthony

多くのことが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
}
11

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
        ]);
    }
}
2
Justin Anthony