Laravel Dusk,如何在测试之间销毁会话数据

2022-08-30 22:42:13

我正在开始使用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.');
    });
}

请参阅注释。第一个函数运行良好,但是当涉及到第二个函数时,我必须首先注销,因为用户已经由于运行第一个函数而登录。这让我感到惊讶,因为我认为单元测试是完全独立的,会话数据会自动销毁。

有没有更好的方法来做到这一点 - 一些我可能错过的黄昏方法 - 而不是不得不调用?$browser->visit('/admin/logout');

谢谢

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

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. 我可以放心地假设第二个浏览器只在这个单一功能期间存在,对吗?
  2. 创建第二个浏览器实例而不是使用拆解方法有哪些明显的优点/缺点?

答案 1

在我的情况下,由于某种原因,登录的用户在测试之间仍然存在,因此我将其放在.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。


答案 2

如果您只想注销已登录的用户,请在登录测试后使用:

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

推荐