如何在 laravel 黄昏测试中共享用户数据



我对Laravel Dusk很陌生(大约不到24小时(,我正在尝试创建一些测试,但我无法通过最初的测试。

所以我有UserCanRegisterTest.phpUserCanSeeDashboardTest.php,在注册用户UserCanRegisterTest.php,如何在UserCanSeeDashboardTest.php中访问该用户信息而无需重新创建其他用户?我尝试过研究,但我掉进了一个兔子洞,我看过内存、饼干、数据库事务,但似乎没有什么意义或显示一个例子。

我是否可以在UserCanSeeDashboardTest.php和我所做的所有其他测试中使用UserCanRegisterTest.php中的$faker->safeEmail$password

UserCanRegisterTest.php

<?php
namespace TestsBrowser;
use IlluminateFoundationTestingDatabaseMigrations;
use LaravelDuskBrowser;
use TestsDuskTestCase;
class UserCanRegisterTest extends DuskTestCase
{
use DatabaseMigrations;
/*public function setUp()
{
parent::setUp();
$this->artisan('db:seed');
}*/
/** @test */
public function user_passes_registration_form()
{
$faker = FakerFactory::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');
});
}
}

这是UserCanSeeDashboardTest.php(请注意我想如何使用$faker->safeEmail和上述测试中的$password,这样我就不需要每次都创建新用户(。

<?php
namespace TestsBrowser;
use IlluminateFoundationTestingDatabaseMigrations;
use LaravelDuskBrowser;
use TestsDuskTestCase;
use AppUser;
class UserCanSeeDashboardTest extends DuskTestCase
{
use DatabaseMigrations;
/*public function setUp()
{
parent::setUp();
//$this->artisan('db:seed');
}*/
/** @test */
public function test_I_can_login_successfully()
{
$this->browse(function ($browser) {
//$user->roles()->attach(1); //Attach user admin role
$browser->visit('/login')
->type('email', $faker->safeEmail)
->type('password', $password)
->press('SIGN IN')
->assertSee('Dashboard');
});
}
}

理想情况下,我有一个注册用户的测试,然后我有其他测试使用该注册用户的数据来登录和测试我应用的其他部分。

PHPUnit 对相互依赖的测试没有很好的支持。PHPUnit 中的测试大多应被视为独立的。该框架确实提供了@depends注释,您可能已经能够将其用于依赖于注册方法的测试,但它仅适用于同一类中的测试。

此外,您无需担心创建多个用户,因为您使用的是在每次测试后为您刷新测试数据库的DatabaseMigrations特征。

在我看来,你有两个选择。您要么:

  1. 将注册码(从$browser->visit('/register')开始的部分(移动到新方法,然后在user_passes_registration_form测试中以及要拥有注册用户的其他测试中调用该方法,或者
  2. 编写一个新方法,您可以从其他测试中调用该方法,该方法直接在数据库中注册用户(例如,使用User::create(。

第二个选项的好处是,HTTP调用更少,这将导致更快的测试运行,并且当注册终结点中断时,只有注册测试会失败(而不是所有测试(。

因此,我的建议是保持注册测试不变,并使用特征或继承来添加一些方法,您可以重复使用这些方法从其他测试方法注册或登录测试用户。

您可以创建一个类MyDuskTestCase,该类继承自DuskTestCase,其中包含用于注册测试用户的方法:

<?php
namespace Tests;
use TestsDuskTestCase;
use AppUser;
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();
}
}

然后,可以在setup方法中运行registerTestUser方法,为每个测试创建测试用户,也可以仅从需要用户的测试中调用该方法。例如:

<?php
namespace TestsBrowser;
use IlluminateFoundationTestingDatabaseMigrations;
use LaravelDuskBrowser;
use TestsMyDuskTestCase;
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');
});

最新更新