I am getting started using Laravel Dusk for browser testing, and have created a couple of tests to test my login form. I have the following code:
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.');
});
}
See the comment. The first function runs fine, but when it comes to the second function, I have to logout first, since the user is already logged in as a result of running the first function. This came as a surprise to me as I thought unit tests were completely independent, with session data being destroyed automatically.
Is there a better way of doing this- some Dusk method that I'm missing perhaps- than having to call $browser->visit('/admin/logout');
?
Thanks
EDIT Thanks for the 2 answers so far, which both seem valid solutions. I've updated the second function to the following:
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.');
});
}
Which does the job. So
- I can safely assume that this second browser only exists for the duration of this single function, correct?
- What are the obvious advantages/disadvantages of creating a second browser instance rather than using the teardown method?