繁体   English   中英

Laravel 黄昏,如何在测试之间破坏 session 数据

[英]Laravel Dusk, how to destroy session data between tests

我开始使用 Laravel Dusk 进行浏览器测试,并创建了几个测试来测试我的登录表单。 我有以下代码:

class LoginTest extends DuskTestCase
{

public function testLogin()
{
    $this->browse(function (Browser $browser) {
        $browser->visit('/admin')
            ->type('email', 'inigo@mydomain.co.uk')
            ->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', 'someemail@afakedomain.com')
            ->type('password', 'somefakepasswordthatdoesntwork')
            ->press('Login')
            ->assertSee('These credentials do not match our records.');
    });
}

见评论。 第一个 function 运行良好,但是当涉及到第二个 function 时,我必须先注销,因为运行第一个 ZC1C425268E68385D1AB5074C17A 后用户已经登录。 这让我感到惊讶,因为我认为单元测试是完全独立的,session 数据会被自动销毁。

有没有比调用$browser->visit('/admin/logout');更好的方法来做到这一点 - 我可能缺少一些 Dusk 方法 - ?

谢谢

编辑感谢到目前为止的 2 个答案,这两个答案似乎都是有效的解决方案。 我已将第二个 function 更新为以下内容:

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

哪个工作。 所以

  1. 我可以放心地假设第二个浏览器只存在于这个单一的 function 期间,对吗?
  2. 创建第二个浏览器实例而不是使用拆卸方法有哪些明显的优点/缺点?

在我的情况下, 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 测试用例的行为,主要浏览器实例保留用于其他测试。

第二种方案,创建第二个浏览器实例,单次测试后销毁

见黄昏/测试案例#L103

我不确定它是否是您正在寻找的答案,但是您可以创建多个浏览器来执行需要清理历史记录/cookies/缓存的测试。

例如,如果您有很多用户应该登录的测试,并且您不想只退出一个检查重置密码表单的测试,那么您可以为这种情况创建一个额外的浏览器并切换到移动到下一个测试时的前一个浏览器。

它可能看起来像下一个方式:

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
  });
}

如果您只对注销当前用户感兴趣,您可以通过执行

     $this->browse(function($browser) {
        $browser->visit('/logout')
                ->waitForText('Sign Into Your Account');
    });

注意:请将“登录您的帐户”文本更改为登录页面上显示的文本。

您可以在Browser实例上将setUp方法与 Dusk 的logout方法配对:

/**
 * Log the user out before each test.
 *
 * @return void
 */
protected function setUp(): void
{
    parent::setUp();

    $this->browse(
        fn (Browser $browser) => $browser->logout()
    );
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM