Laravel在测试具有许多依赖关系的模型之前准备数据库是否有更好的方法?

时间:2017-01-23 09:05:26

标签: php laravel testing phpunit

我正在使用Laravel 5.2作为我的网络应用程序和扩展PHPUnit的捆绑测试工具。

我正在为一个对模型执行更新的页面编写测试。在提交表单之前,测试检查其中一个模型的属性是否未更改,以防止两个用户在同时在浏览器中打开模型时更新模型。

测试需要在我的Laravel Web应用程序中使用模型,即App\Models\Application,并且我正在使用工厂为此模型创建一些虚假数据。 Application模型有许多belongsTo关系,这反过来要求在创建Application模型之前使用工厂在测试中创建相关模型。

例如,Application模型与belongsTo的关系Applicant,因此我需要在创建{{1}之前创建一个带有工厂的Applicant模型ApplicationApplicant之间也有belongsTo个关系,我之前需要创建它......你明白了。

因此,简而言之,我正在创建几个模型实例,因为我想测试一个模型的关系依赖性。

所以这让我想知道我是否采取了错误的做法?有没有更简单的方法,我只创建正在测试的模型?

以下是我测试的代码:

User

感谢您的任何建议。

1 个答案:

答案 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
}