web-dev-qa-db-ja.com

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

LaravelブラウザのテストにDuskを使い始めて、ログインフォームをテストするためのテストをいくつか作成しました。次のコードがあります。

_class LoginTest extends DuskTestCase
{

public function testLogin()
{
    $this->browse(function (Browser $browser) {
        $browser->visit('/admin')
            ->type('email', '[email protected]')
            ->type('password', 'MyPass')
            ->press('Login')
            ->assertSee('Loading...');
    });
}

public function testLoginFailure(){
    $this->browse(function (Browser $browser){

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

        $browser->visit('/admin')
            ->type('email', '[email protected]')
            ->type('password', 'somefakepasswordthatdoesntwork')
            ->press('Login')
            ->assertSee('These credentials do not match our records.');
    });
}
_

コメントを参照してください。最初の関数は正常に実行されますが、2番目の関数については、最初にログアウトする必要があります。これは、最初の関数を実行した結果、ユーザーが既にログインしているためです。ユニットテストは完全に独立していて、セッションデータは自動的に破棄されると思っていたので、これは私にとって驚きでした。

これを行うには、$browser->visit('/admin/logout');を呼び出さなければならないよりも、おそらく私が見逃しているいくつかのDuskメソッドがあるのでしょうか?

ありがとう

[〜#〜] edit [〜#〜]これまでの2つの回答に感謝します。どちらも有効な解決策のようです。 2番目の関数を次のように更新しました。

_public function testLoginFailure(){
    $this->createBrowsersFor(function(Browser $browser){
        $browser->visit('/admin')
            ->type('email', '[email protected]')
            ->type('password', 'somefakepasswordthatdoesntwork')
            ->press('Login')
            ->assertSee('These credentials do not match our records.');
    });
}
_

どちらが仕事をします。そう

  1. この2番目のブラウザーは、この単一の関数の期間だけ存在すると思いますが、正しいですか?
  2. ティアダウンメソッドを使用するのではなく、2番目のブラウザーインスタンスを作成することの明らかな利点/欠点は何ですか?
14
Inigo

私の場合、tearDown()は十分ではありませんでした。何らかの理由で、ログに記録されたユーザーがテスト間で保持されていたため、deleteAllCookies()setUp()に配置しました。

だから、私のDuskTestCase.phpに追加しました:

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

これは、すべてのテストでセッションをフラッシュできる唯一の方法でした。お役に立てば幸いです。

注:私はHomesteadとWindows 10を使用しています。

16
Zalo

ログインしたユーザーをログアウトするだけの場合は、ログインテストの後に次のコマンドを使用します。

 $browser->visit('/login')
     ->loginAs(\App\User::find(1))
     ...
     some assertions
     ...
     ->logout();
8
branci

tearDown()メソッドでセッションをフラッシュできます:

class LoginTest extends DuskTestCase
{
    // Your tests

    public function tearDown()
    {
        session()->flush();

        parent::tearDown();
    }
}
6
Martin Bean

もしそうならそれは誰か他の人を助けます。 tearDownメソッドを使用して、すべてのCookieをクリアできます。以下はそうする例です、このメソッドをDuskTestCase.phpファイルに追加できます

public function tearDown()
{
    parent::tearDown();

    $this->browse(function (Browser $browser) {
        $browser->driver->manage()->deleteAllCookies();
    });
}

これがお役に立てば幸いです。

5
hashmi

電話できます

$this->logout();

InteractsWithAuthentication-Github

編集:

これはDusk Testケースの動作であり、プライマリブラウザーインスタンスは他のテストのために残ります。

2番目のソリューションは、2番目のブラウザーインスタンスを作成します。これは、1回のテスト後に破棄されます。

Dusk/TestCase#L103を参照

4
OuailB

その答えがあなたが探しているものかどうかはわかりませんが、複数のブラウザを作成して、履歴/ Cookie /キャッシュをクリーンアップする必要があるテストを実行できます。

たとえば、ユーザーがログインする必要がある多くのテストがあり、パスワードのリセットフォームをチェックする1つのテストだけをログアウトしたくない場合は、このケースに対応する追加のブラウザーを作成して、次のテストに移動するときに前のブラウザ。

次のようになります。

public function testfirstTest()
{
  $this->browse(function ($browser) {
    //some actions where you login etc
  });
}

public function testSecondTestWhereYouNeedToBeLoggedOut()
{
  $this->browse(function ($currentBrowser, $newBrowser) {
  //here the new browser will be created, at the same time your previous browser window won't be closed, but history/cookies/cache will be empty for the newly created browser window
    $newBrowser->visit('/admin')
    //do some actions
    $newBrowser->quit();//here you close this window
  });
}

public function testWhereYouShouldContinueWorkingWithUserLoggedIn()
{
  $this->browse(function ($browser) {
    $browser->doSomething()//here all actions will be performed in the initially opened browser with user logged in
  });
}
3