PHP-модуль в laravel аварийно завершает работу с сообщением "фасад не был установлен"

PHP-модуль в laravel аварийно завершает работу с сообщением "фасад не был установлен"

10.03.2020 01:18:41 Просмотров 12 Источник

Я пытаюсь написать несколько простых тестов PHPUnit, которые проверят мои запросы User class и некоторые запросы DB.

Я получаю A facade has not been set при каждом вызове функции запроса БД, и я не знаю, почему.

Я забыл импортировать или включить файл, или невозможно запустить PHP-модуль с классом laravel DB ?

UserTest.php

<?php

namespace Tests\Unit;

use App\User;
use Tests\TestCase;

class UserTest extends TestCase
{

    const TABLENAME = 'user';
    protected static $userid;

    public static function setUpBeforeClass(): void
    {
        $user           = new \stdClass();
        $user->name     = "Test 1";
        $user->email    = "test@test.com";
        $user->password = "Password";

        self::$userid = User::createNewUser($user);
    }


    /**
     * Create a user
     *
     * @return void
     */
    public function testGetUser(): void
    {
        $user = new User(self::$userid);
        var_dump($user);

        if (empty($user)) {
            $this->assertTrue(false);
        } else {
            $this->assertTrue(true);
        }
    }
}

User.php

<?php

namespace App;

use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Support\Facades\DB;
use StdClass;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = ['name', 'email', 'password'];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = ['password'];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [];

    private $id        = 0;
    private $username  = null;
    private $email     = null;
    private $createdAt = null;
    private $updatedAt = null;

    const TABLENAME = 'user';

    public function __construct(int $userId)
    {
        $user = DB::table(self::TABLENAME)->where('id', $userId)->get();

        $this->id        = $user->id;
        $this->username  = $user->name;
        $this->email     = $user->email;
        $this->createdAt = $user->createdAt;
        $this->updatedAt = $user->updatedAt;
    }

    public function get(string $field): string
    {
        return $this->{$field};
    }

    public function updateUser(stdClass $user): boolean
    {
        $user->id = $this->id;
        $result   = DB::table(self::TABLENAME)->update((array) $user);

        return ($result >= 1) ? true : false;
    }

    public static function createNewUser(stdClass $user): int
    {
        return DB::table(self::TABLENAME)->insertGetId((array) $user);
    }
}
У вопроса есть решение - Посмотреть?

Ответы - PHP-модуль в laravel аварийно завершает работу с сообщением "фасад не был установлен" / PHP Unit in laravel crashes with message "A facade has not been set"

Dato DT

10.03.2020 02:53:39

<?php 
namespace Tests\Unit;

use Illuminate\Notifications\Notifiable;
use Illuminate\Support\Facades\DB;
use App\User;
use Tests\TestCase;

class UserTest extends TestCase
{

    const TABLENAME = 'user';
    protected static $userid;


    protected function setUp(){
      parent::setUp();
    }

    protected function tearDown()
    {
       parent::tearDown();
    }
    public static function setUpBeforeClass(): void
    {
        $user           = new \stdClass();
        $user->name     = "Test 1";
        $user->email    = "test@test.com";
        $user->password = "Password";

        self::$userid = User::createNewUser($user);
    }


    /**
     * Create a user
     *
     * @return void
     */
    public function testGetUser(): void
    {
        $user = new User(self::$userid);
        var_dump($user);

        if (empty($user)) {
            $this->assertTrue(false);
        } else {
            $this->assertTrue(true);
        }
    }
}

?>
Является ответом!
NashPL

12.03.2020 10:26:40

Правильно. Подход к этому был неправильным с точки зрения попрошайничества. Я не использовал правильную структуру модели, поэтому чистые вызовы DB были неправильными, поскольку мы не должны использовать SQL-запросы в проекте Laravel. (Если только в этом нет абсолютной необходимости) После создания новой модели и заполнения базы на основе документации Laravel она заработала и начала проходить испытания.

https://laravel.com/docs/6.x/eloquent

Закрыть X