PHPUnit не имеет большой поддержки тестов, которые зависят друг от друга. Тесты в PHPUnit должны рассматриваться как независимые. Инфраструктура предоставляет аннотацию @depends
, которую вы могли бы использовать для тестов, которые зависят от метода регистрации, но она работает только для тестов того же класса .
Кроме того, вам не нужно беспокоиться о создании нескольких пользователей, поскольку вы используете черту 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
meth используйте метод 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');
});
}
}
Для входа в систему вы можете добавить другой метод в базовый тестовый класс для входа в систему тестового пользователя или использовать метод loginAs
, который Dusk обеспечивает:
$user = this->getTestUser();
$this->browse(function ($browser) {
$browser->loginAs($user)
->visit('/home');
});