Laravel Dusk 测试运行后从数据库中删除模型?

Posted

技术标签:

【中文标题】Laravel Dusk 测试运行后从数据库中删除模型?【英文标题】:Deleting models from database after Laravel Dusk tests have run? 【发布时间】:2017-06-23 09:30:39 【问题描述】:

我刚刚开始研究 Dusk - 我正在测试一些用户功能。

以下是我当前的测试,但是我正在尝试自己清理 - 例如,应该从数据库中删除新创建的用户。

我尝试使用tearDown 方法,但它似乎并没有真正删除它。

我通常会如何处理需要在之后进行垃圾处理的临时模型?

<?php

namespace Tests\Browser;

use App\User;
use Tests\DuskTestCase;
use Illuminate\Foundation\Testing\DatabaseMigrations;

class LoginTest extends DuskTestCase


    protected $user = null;

    public function testIfPublicUsersLogin()
    
        $this->user = $user = factory(User::class)->create([
            'is_student' => 0
        ]);

        $this->browse(function ($browser) use ($user) 

            $browser->visit('/login')
                ->assertVisible('#email')
                ->type('#email', $user->email)
                ->type('#password', 'secret')
                ->press('#loginButton')
                ->assertPathIs('/play');
        );
    

    public function tearDown()
    
        if ($this->user) 
            User::destroy($this->user->id);
            //$this->user->delete();
        
    

【问题讨论】:

【参考方案1】:

有多种方法可以实现这一点:

    使用 DatabaseTransactions 特征,以便在每次测试后进行事务回滚。为此,请在您的 php 文件中添加:use Illuminate\Foundation\Testing\DatabaseTransactions;,并在您的测试类中添加 use DatabaseTransactions; 如果您想在每次测试之前和之后迁移和迁移回滚而不是将它们包装到事务中,您可能需要使用 DatabaseMigrations 特征。为此,请在您的 php 文件中添加:use Illuminate\Foundation\Testing\DatabaseMigrations;,并在您的测试类中添加 use DatabaseMigrations; 如果要使用自定义设置和拆卸方法,请使用 afterApplicationCreatedbeforeApplicationDestroyed 方法 而是注册回调

【讨论】:

【参考方案2】:
<?php

namespace Tests\Browser;

use App\User;
use Tests\DuskTestCase;
use Illuminate\Foundation\Testing\DatabaseMigrations;

class LoginTest extends DuskTestCase


    protected $user = null;

    public function testIfPublicUsersLogin()
    
        $this->user = $user = factory(User::class)->create([
            'is_student' => 0
        ]);

        $this->browse(function ($browser) use ($user) 

            $browser->visit('/login')
                ->assertVisible('#email')
                ->type('#email', $user->email)
                ->type('#password', 'secret')
                ->press('#loginButton')
                ->assertPathIs('/play');

            $user->delete();
        );
    

此代码行$user-&gt;delete在测试后删除您的数据。 tearDown 方法没用。

【讨论】:

以上是关于Laravel Dusk 测试运行后从数据库中删除模型?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Laravel Dusk 测试身份验证? [关闭]

Laravel Dusk 忽略 .env.dusk 和 .env.dusk.local(使用 Valet 和 Laravel 5.5)

经过测试,chrome 进程仍然在 Docker 容器中的 Laravel Dusk

带有laravel Dusk的测试案例,显示错误'users_email_unique'

使用 phpunit.xml、.env.dusk.local 和 sqlite 内存数据库设置 Laravel 5.4 和 Dusk

Laravel Dusk 错误:无法连接到 localhost 端口 9515:连接被拒绝