我正在使用Laravel 5.2作为我的网络应用程序和扩展PHPUnit的捆绑测试工具。
我正在为一个对模型执行更新的页面编写测试。在提交表单之前,测试检查其中一个模型的属性是否未更改,以防止两个用户在同时在浏览器中打开模型时更新模型。
测试需要在我的Laravel Web应用程序中使用模型,即App\Models\Application
,并且我正在使用工厂为此模型创建一些虚假数据。 Application
模型有许多belongsTo
关系,这反过来要求在创建Application
模型之前使用工厂在测试中创建相关模型。
例如,Application
模型与belongsTo
的关系Applicant
,因此我需要在创建{{1}之前创建一个带有工厂的Applicant
模型Application
与Applicant
之间也有belongsTo
个关系,我之前需要创建它......你明白了。
因此,简而言之,我正在创建几个模型实例,因为我想测试一个模型的关系依赖性。
所以这让我想知道我是否采取了错误的做法?有没有更简单的方法,我只创建正在测试的模型?
以下是我测试的代码:
User
感谢您的任何建议。
答案 0 :(得分:1)
您是否因外键限制而创建所有这些内容?如果您只是想检查一个没有任何关系的模型,那么Schema::disableForeignKeyConstraints();
就是您的朋友:
/**
* @test
*/
public function throw_exception_when_application_status_is_modified_after_submission()
{
\Schema::disableForeignKeyConstraints();
/**
* Arrange
*/
// create admin user
$adminUser = factory(User::class)->create();
$adminUser->attachRole(factory(Role::class, 'admin')->create());
// create application
$application = factory(Application::class)->make([
'status' => 'pending',
'application_id' => 0,
'application_type' => 'App\Models\ExperienceLetter',
'organisation_id' => 0,
'applicant_id' => 0,
]);
// 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);
\Schema::enableForeignKeyConstraints();
/**
* Assert
*/
$this->assertEquals(302, $response->status());
// assertSessionHasErrors
}