Как поделиться пользовательскими данными в laravel сумерках - PullRequest
1 голос
/ 12 января 2020

Я очень плохо знаком с Laravel Сумерки (например, менее чем за 24 часа), и я экспериментирую с созданием некоторых тестов, но я не могу обернуться, чтобы пройти первый тест.

Итак, у меня есть UserCanRegisterTest.php и UserCanSeeDashboardTest.php, в UserCanRegisterTest.php я регистрирую пользователя, как я могу получить доступ к этой информации пользователя в UserCanSeeDashboardTest.php без необходимости воссоздания другого пользователя? Я попытался исследовать, но я упал в кроличью нору, я посмотрел на память, куки, DatabaseTransactions, но, кажется, ничто не имеет смысла или показать пример.

Возможно ли мне использовать $faker->safeEmail и $password из UserCanRegisterTest.php в UserCanSeeDashboardTest.php и все другие тесты, которые я делаю?

UserCanRegisterTest. php:

<?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');
        });
    }
}

Вот UserCanSeeDashboardTest. php (обратите внимание, как я хотел бы использовать $ faker-> safeEmail и $ password из вышеприведенного теста, поэтому мне не нужно создавать новый пользователь каждый раз).

<?php

namespace Tests\Browser;

use Illuminate\Foundation\Testing\DatabaseMigrations;
use Laravel\Dusk\Browser;
use Tests\DuskTestCase;
use App\User;

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');
        });
    }
}

В идеале у меня есть тест, который регистрирует пользователя, затем у меня есть другие тесты, которые используют данные этого зарегистрированного пользователя для входа в систему и тестирования других частей моего приложения.

1 Ответ

0 голосов
/ 13 января 2020

PHPUnit не имеет большой поддержки тестов, которые зависят друг от друга. Тесты в PHPUnit должны рассматриваться как независимые. Инфраструктура предоставляет аннотацию @depends, которую вы могли бы использовать для тестов, которые зависят от метода регистрации, но она работает только для тестов того же класса .

Кроме того, вам не нужно беспокоиться о создании нескольких пользователей, поскольку вы используете черту DatabaseMigrations, которая обновляет вашу тестовую базу данных после каждого теста.

Способ Я вижу, у вас есть два варианта. Либо вы:

  1. Переместите свой регистрационный код (деталь, начинающаяся с $browser->visit('/register')) на новый метод, а затем вызовите этот метод как в вашем тесте user_passes_registration_form, так и в других ваших тестах, где вы хотите иметь зарегистрированного пользователя или
  2. Написать новый метод, который можно вызывать из других тестов, который регистрирует пользователя непосредственно в вашей базе данных (например, с использованием 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');
});
...