[Dusk]Laravel8 Duskで自動的にブラウザのセッションをクリアする

Laravel ロゴ

Laravel8 Duskでは、テストが変わってもブラウザの状態が引き継がれてしまいます。
テストが変わってログイン中の状態を引き継いでほしくないなど、いちいち気にしないと行けないのは面倒過ぎます。逆に、簡略化のために引き継いでほしいということもあります。

この辺りを自動でなんとかするコードを書いてみました。

Amazon.co.jp

test/DuskTestCase.phpに幾つかのメソッドを追加します。
下記は追記したコードのみの抜粋です。

abstract class DuskTestCase extends BaseTestCase
{

// テストごとにセッションを削除するか?
private bool $autoDeleteSessions = true;

/**
* テスト実行前のクリーンアップ処理
*/
public function tearUp(): void
{
    parent::tearUp();
    if($this->autoDeleteSessions) {
        $this->deleteBrowserSessions();
    }
}

/**
* 次のテスト実行前のクリーンアップ処理
*/
public function tearDown(): void
{
    parent::tearDown();
    if($this->autoDeleteSessions) {
        $this->deleteBrowserSessions();
    }
}

/**
* ブラウザのセッションをクリア
*/
public function deleteBrowserSessions(): void
{
    foreach (static::$browsers as $browser) {
        $browser->driver->manage()->deleteAllCookies();
    }
}

/**
* テストごとにブラウザセッションを削除するかどうか設定
*/
public function setAutoDeleteSessions(bool $flag): void
{
    $this->autoDeleteSessions = $flag;
}
}
Amazon.co.jp

setAutoDeleteSessions()メソッドで自動クリアを有効にするか設定できます。デフォルトはクリアするになっていますのでクリアしたくない場合は各テストクラスの tearUp()メソッドでこのメソッドを呼んで設定すると良いでしょう。
任意のタイミングで手動でクリアしたい場合もあると思いますのでdeleteBrowserSessions()もつけました。

タイトルとURLをコピーしました