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.');
});
}
_
どちらが仕事をします。そう
私の場合、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を使用しています。
ログインしたユーザーをログアウトするだけの場合は、ログインテストの後に次のコマンドを使用します。
$browser->visit('/login')
->loginAs(\App\User::find(1))
...
some assertions
...
->logout();
tearDown()
メソッドでセッションをフラッシュできます:
class LoginTest extends DuskTestCase
{
// Your tests
public function tearDown()
{
session()->flush();
parent::tearDown();
}
}
もしそうならそれは誰か他の人を助けます。 tearDown
メソッドを使用して、すべてのCookieをクリアできます。以下はそうする例です、このメソッドをDuskTestCase.phpファイルに追加できます
public function tearDown()
{
parent::tearDown();
$this->browse(function (Browser $browser) {
$browser->driver->manage()->deleteAllCookies();
});
}
これがお役に立てば幸いです。
電話できます
$this->logout();
InteractsWithAuthentication-Github
編集:
これはDusk Testケースの動作であり、プライマリブラウザーインスタンスは他のテストのために残ります。
2番目のソリューションは、2番目のブラウザーインスタンスを作成します。これは、1回のテスト後に破棄されます。
その答えがあなたが探しているものかどうかはわかりませんが、複数のブラウザを作成して、履歴/ 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
});
}