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