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

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

看评论.第一个函数运行正常,但是当涉及第二个函数时,我必须先注销,因为用户已经因运行第一个函数而登录.这让我感到意外,因为我认为单元测试是完全独立的,会话数据会自动销毁.

是否有一种更好的方法可以做到这一点 – 我可能缺少的一些Dusk方法 – 而不是必须调用$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.');
    });
}

这项工作是做什么的.所以

>我可以放心地假设第二个浏览器仅在此单个函数的持续时间内存在,对吗?
>创建第二个浏览器实例而不是使用拆解方法有哪些明显的优点/缺点?

最佳答案
在我的情况下,tearDown()是不够的,由于某种原因,记录的用户仍然在测试之间保持不变,所以我在setUp()中放置了deleteAllCookies().

所以,在我的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.

转载注明原文:php – Laravel Dusk,如何在测试之间销毁会话数据 - 代码日志