Я использую Laravel 5.2 для своего веб-приложения и связанных инструментов тестирования, которые расширяют PHPUnit.Laravel готовит базу данных перед тестом на модель со многими зависимостями, есть ли лучший способ?
Я пишу тест для страницы, которая выполняет обновление модели. Тест проверяет, что один из атрибутов модели не изменился до отправки формы, чтобы не допустить, чтобы два пользователя обновили модель, если они одновременно открыли ее в своем браузере.
Тест требует использования модели в моем веб-приложении Laravel, а именно App\Models\Application
, и я использую заводы для создания некоторых поддельных данных для этой модели. Модель Application
имеет множество отношений belongsTo
, что, в свою очередь, требует создания соответствующей модели в рамках теста с использованием заводов до создания модели Application
.
Например, Application
модель имеет belongsTo
отношения с Applicant
, так что мне нужно, чтобы создать Applicant
модель с завода до создания Application
и Applicant
также имеет belongsTo
отношения с User
, которые я также необходимо создать до того ... у вас есть идея.
Итак, вкратце, я создаю несколько экземпляров модели из-за зависимостей отношений одной модели, которую я хочу проверить.
Так что это заставило меня задуматься, не принимаю ли я неправильный подход? Есть ли более простой подход, когда я создаю только модель, которая тестируется?
Вот код из моего теста:
/**
* @test
*/
public function throw_exception_when_application_status_is_modified_after_submission()
{
/**
* Arrange
*/
// create roles
factory(Role::class, 'admin')->create();
factory(Role::class, 'applicant')->create();
// create admin user
$adminUser = factory(User::class)->create();
$adminUser->attachRole(Role::whereName('admin')->first());
// create applicant user
$applicantUser = factory(User::class)->create();
$applicantUser->attachRole(Role::whereName('applicant')->first());
// create organisation with type
$organisationType = factory(OrganisationType::class)->create();
$organisation = factory(Organisation::class)->create();
$organisation->organisationTypes()->attach($organisation->id);
// create sub application
$subApplication = factory(ExperienceLetter::class)->create();
// create applicant
$applicant = factory(Applicant::class)->create([
'user_id' => $applicantUser->id
]);
// create application
$application = factory(Application::class)->make([
'status' => 'pending',
'application_id' => $subApplication->id,
'application_type' => 'App\Models\ExperienceLetter',
'organisation_id' => $organisation->id,
'applicant_id' => $applicant->id,
]);
// prep data
$data = [
'action' => 'accept',
'details' => 'email sent',
'application_id' => $application->id,
'application_status' => 'pending',
'verification' => 'email',
];
/**
* Act
*/
// log in
$this->actingAs($adminUser);
// alter status before call()
$application->status = 'verification';
$application->save();
$response = $this->call('POST', route('admin.application.action.store'), $data);
/**
* Assert
*/
$this->assertEquals(302, $response->status());
// assertSessionHasErrors
}
Спасибо за любые советы.
Hi Eric. Спасибо за ваш ответ. Вот именно причина! Я скоро это сделаю и посмотрю, как это работает. Будет ли это работать для базы данных тестирования MySQL и SQLite в базе данных тестирования БД? – haakym
В настоящее время я использую Laravel 5.2 и не могу найти этот метод в базе кода. Получение этой ошибки при выполнении моих тестов 'Ошибка: вызов неопределенного метода Illuminate \ Database \ Schema \ MySqlBuilder :: disableForeignKeyConstraints()'. Также попробовали '\ DB :: getSchemaBuilder() -> disableForeignKeyConstraints();' с теми же результатами. Есть идеи? – haakym
Состояние документов API существует в 5.2 здесь: https://laravel.com/api/5.2/Illuminate/Database/Schema/Builder.html, но когда я смотрю на 'vendor \ laravel \ framework \ src \ Illuminate \ Database \ Schema \ Builder' в моей базе кода Я не могу найти метод. Возможно, мне нужно обновить второстепенную версию Laravel? – haakym