我对Laravel Dusk非常陌生(例如不到24小时),我正在尝试创建一些测试,但是我无法克服最初的测试。
因此我有UserCanRegisterTest.php
和UserCanSeeDashboardTest.php
,在UserCanRegisterTest.php
中注册用户,如何在UserCanSeeDashboardTest.php
中访问该用户信息而不必重新创建另一个用户?我曾尝试进行研究,但跌倒了一个小洞,研究了内存,cookie,DatabaseTransactions,但似乎没有任何意义或显示示例。
我是否可以使用$faker->safeEmail
中$password
的{{1}}和UserCanRegisterTest.php
以及我进行的所有其他测试? >
UserCanRegisterTest.php :
UserCanSeeDashboardTest.php
这里是UserCanSeeDashboardTest.php (请注意,我想如何使用上述测试中的$ faker-> safeEmail和$ password,因此我不需要每次都创建新用户时间)。
<?php
namespace Tests\Browser;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Laravel\Dusk\Browser;
use Tests\DuskTestCase;
class UserCanRegisterTest extends DuskTestCase
{
use DatabaseMigrations;
/*public function setUp()
{
parent::setUp();
$this->artisan('db:seed');
}*/
/** @test */
public function user_passes_registration_form()
{
$faker = \Faker\Factory::create();
/*$roleSeeder = new RoleTableSeeder();
$roleSeeder->run();
$permissionSeeder = new PermissionTableSeeder();
$permissionSeeder->run();*/
$this->browse(function($browser) use ($faker) {
$password = $faker->password(9);
$browser->visit('/register')
//->assertSee('Welcome Back!')
->type('company_name', $faker->company)
->type('name', $faker->name)
->type('email', $faker->safeEmail)
->type('password', $password)
->type('password_confirmation', $password)
->press('REGISTER')
->assertPathIs('/register');
});
}
}
理想情况下,我有一个注册用户的测试,然后有其他测试使用该注册用户的数据登录并测试应用程序的其他部分。
答案 0 :(得分:0)
PHPUnit对相互依赖的测试没有很好的支持。大多数情况下,PHPUnit中的测试应视为独立的。该框架确实提供了@depends
批注,您可能已经可以将其用于依赖于注册方法的测试,但是它仅适用于同一class中的测试。
此外,您不必担心创建多个用户,因为您使用的是DatabaseMigrations
特性,它可以在每次测试后为您刷新测试数据库。
从我的角度来看,您有两个选择。要么你:
$browser->visit('/register')
开始的部分)移动到新方法,然后在您想要注册用户的user_passes_registration_form
测试和其他测试中调用该方法,或User::create
)。第二个选项的好处是您的HTTP调用将减少,这将导致测试运行更快,并且当注册端点损坏时,只有注册测试会失败(而不是所有测试)。
所以我建议您保持注册测试不变,并使用特征或继承来添加一些方法,您可以重用这些方法来从其他测试方法注册或登录测试用户。
您可以创建一个类MyDuskTestCase
,该类继承自DuskTestCase
,其中包含注册测试用户的方法:
<?php
namespace Tests;
use Tests\DuskTestCase;
use App\User;
use Hash;
abstract class MyDuskTestCase extends DuskTestCase
{
private $email = 'test@example.com';
private $password = 'password';
public function setup(): void
{
parent::setUp();
// If you want to run registerTestUser for every test:
// registerTestUser();
}
public function registerTestUser()
{
User::create([
'email' => $this->email,
'name' => 'My name',
'password' => Hash::make($this->password)
]);
// assign a role, etc.
}
public function getTestUser()
{
return User::where('email', $this->email)->first();
}
}
然后,您可以在registerTestUser
方法中运行setup
方法为每个测试创建测试用户,也可以仅在需要用户的测试中调用该方法。例如:
<?php
namespace Tests\Browser;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Laravel\Dusk\Browser;
use Tests\MyDuskTestCase;
class UserCanRegisterTest extends MyDuskTestCase
{
use DatabaseMigrations;
public function test_I_can_login_successfully()
{
$this->registerTestUser();
$this->browse(function ($browser) use ($user) {
$browser->visit('/login')
->type('email', $this->email)
->type('password', $this->password)
->press('SIGN IN')
->assertSee('Dashboard');
});
}
}
对于登录,您可以在基本测试类中添加其他方法以登录测试用户,也可以使用Dusk提供的loginAs
方法:
$user = this->getTestUser();
$this->browse(function ($browser) {
$browser->loginAs($user)
->visit('/home');
});