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
        ]);
    }
}
Другие вопросы по тегам