Copy & Paste Engineer

Laravel Dusk テスト間でセッションデータを破棄する方法

Laravel Dusk テスト間でセッションデータを破棄する方法

Laravel Duskでテストを作成していると1クラス内で複数のテストメソッドを作った場合に同じブラウザでテストをされていたようでエラーになりました。 そのため、例えばテストでログインした場合、次のテスト時にはログアウトを都度しなければいけないのと、前のセッションデータが残っていて想定してないエラーが発生する可能性があります。 今回はその対策をメモ。

サンプルテスト(失敗)

<?php
class LoginTest extends DuskTestCase
{
    public function testLogin()
    {
        $this->browse(function (Browser $browser) {
            $browser->visit('/admin')
                ->type('email', 'hoge@exampl.org')
                ->type('password', 'hogepass')
                ->press('Login')
                ->assertSee('Loading...');
        });
    }

    public function testLoginFailure(){
        $this->browse(function (Browser $browser){
             // I have to add this to logout first, otherwise it's already logged in for this test!
            $browser->visit('/admin/logout');

            $browser->visit('/admin')
                ->type('email', 'fuga@exampl.org')
                ->type('password', 'fugapass')
                ->press('Login')
                ->assertSee('These credentials do not match our records.');
        });
    }
}

この場合、行18行目でわざわざログアウトしています。 そうすると前のデータが残って予期せぬエラーが発生する可能性もあります。

サンプルテスト(成功)

$this->browse$this->createBrowsersFor に変更するだけ対応可能です。 こうすることによってテストごとに新たなブラウザを生成します。

修正コードを開く

修正コード

<?php
class LoginTest extends DuskTestCase
{
    public function testLogin()
    {
        $this->createBrowsersFor(function (Browser $browser) {
            $browser->visit('/admin')
                ->type('email', 'hoge@exampl.org')
                ->type('password', 'hogepass')
                ->press('Login')
                ->assertSee('Loading...');
        });
    }

    public function testLoginFailure(){
        $this->createBrowsersFor(function (Browser $browser){
            $browser->visit('/admin')
                ->type('email', 'fuga@exampl.org')
                ->type('password', 'fugapass')
                ->press('Login')
                ->assertSee('These credentials do not match our records.');
        });
    }
}

クッキーの削除

人によっては createBrowsersFor だけでは不十分のようで、setup時にクッキーを破棄して対応をする必要があるようです。

<?php
class LoginTest extends DuskTestCase
{
    /**
    * Temporal solution for cleaning up session
    */
    protected function setUp()
    {
        parent::setUp();
        foreach (static::$browsers as $browser) {
            $browser->driver->manage()->deleteAllCookies();
        }
    }

参考

追記(2021/02/16)

僕の場合 createBrowsersFor ではうまく行かなかったので browsedeleteAllCookies で対応いたしました。

Laravel Dusk バージョン

Laravel Dusk 6.11