Что Laravel 5.2 ошибок блоков тестов: BadMethodCallException: вызов неопределенной метод осветитьбазы данныхзапросыконструктор::сделать()


Я пытаюсь настроить PHPunit с Laravel 5.2. Я следовал документации для простого модульного теста, однако каждый тест выдает одну и ту же ошибку:

1) CreateAccountTest:: testCreateUserWithInvalidEmail BadMethodCallException: вызов неопределенной метод IlluminateDatabaseQueryBuilder:: make ()

/некоторые/путь/поставщика/фреймворк Laravel/рамках/в src/освещения/базы данных/запрос/Строитель.php: 2405 /некоторые/путь/поставщика/фреймворк Laravel/рамках/в src/освещения/базы данных/красноречивый/Строитель.php: 1426 /некоторые/путь/поставщика/фреймворк Laravel/рамках/в src/освещения/базы данных/красноречивый/модель.php: 3526 /некоторые/путь/поставщика/фреймворк Laravel/рамках/в src/светить/основы/тестирования/проблемы/MakesHttpRequests.php: 504 /некоторые/путь/поставщика/фреймворк Laravel/рамках/в src/светить/основы/тестирования/проблемы/MakesHttpRequests.php: 504 /некоторые/путь/поставщика/фреймворк Laravel/рамках/в src/светить/основы/тестирования/проблемы/MakesHttpRequests.php: 73 /some / path / tests / UnitTests / CreateAccountTest.php: 32

Все мои модульные тесты выглядят примерно так, за исключением того, что каждый раз они утверждают другое свойство:

class CreateAccountTest extends TestCase
{

    protected $body;
    protected $app;

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

        $this->app = factory(AppModelsApp::class)->create([
           'name' => 'Test Suite'
       ]);

        $this->body = [
            'name' => 'Doe',
            'firstName' => 'John',
            'login' => 'john.doe',
            'email' => 'john.doe@johndoe.com',
            'password' => 'test1324',
            'repeatPassword' => 'test1234',
            'appId' => $this->app->id
        ];
    }

    public function testCreateUserWithInvalidEmail() {
        $this->body['email'] = 'this_is_not_a_valid_email_address';

        $this->json('POST', '/profile/create', $this->body)
             ->assertResponseStatus(400);
    }

}

Контроллер профиля, содержащий соответствующий код:

<?php

namespace AppHttpControllersAccount;

use IlluminateHttpRequest;
use AppHttpControllersController;
use AppHttpRequestsAccountCreateAccountPostRequest;
use AppModelsAccessToken;
use AppModelsUser;

class ProfileController extends Controller
{

    public function createUser(CreateAccountPostRequest $request) {

        $user = new User();
        $user->firstname = $request['firstName'];
        $user->name = $request['name'];
        $user->email = $request['email'];
        $user->password = $request['password'];
        $user->save();

        $accessToken = AccessToken::createAccessToken($user->id);
        $accessToken->save();

        return $this->sendSuccessResponse();
    }
}

Фабрика моделей:

$factory->define(AppModelsApp::class, function (FakerGenerator $faker) {
    $company = $faker->company;
    return [
        'name' => $company,
        'submit_description' => $faker->sentence($nbWords = 6, $variableNbWords = true),
        'subdomain' => str_replace(' ', '', $company),
        'advancedFilter' => 0,
        'isdeleted' => 0,
        'defaultlanguage' => 'en',
        'timestamp' => time()
    ];
});

Строка 32, как указано в stacktrace, является следующей строкой:

 $this->json('POST', '/profile/create', $this->body)
             ->assertResponseStatus(400);
Все это кажется очень простым в соответствии с документами, и я понятия не имею, что здесь происходит.
1 4

1 ответ:

Ладно, я понял, что здесь происходит. Я создал поле protected $app;, которое случайно переопределяет поле $app из родительского класса TestCase. Это преобразовало класс из приложения Laravel (Illuminate\Foundation\Application) в Illuminate/Database/Eloquent/Model, в котором функция make () не существует. Вот почему была выброшена ошибка.

Таким образом, в принципе, переименование поля $app в $application или что-либо другое решает проблему.