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

时间:2020-01-12 16:32:58

标签: php laravel laravel-dusk

我对Laravel Dusk非常陌生(例如不到24小时),我正在尝试创建一些测试,但是我无法克服最初的测试。

因此我有UserCanRegisterTest.phpUserCanSeeDashboardTest.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');
        });
    }
}

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

1 个答案:

答案 0 :(得分:0)

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

此外,您不必担心创建多个用户,因为您使用的是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方法中运行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');
});