使用 PHPunit 在 Laravel 中测试登录脚手架

Testing login scaffolding in Laravel with PHPunit

无法通过 Laravel 脚手架的登录测试。

我尝试使用 $user = User::first(); 和工厂 User::factory()->create(); 访问数据库 $user。在这两种情况下,我都能够成功 dd($user) 信息,因此这意味着 $user 存在并且可以访问。

我还尝试使用 bcrpyt()Hash::make 密码对凭据进行硬编码 - 错误似乎也发生了。

我没有使用 RefreshDatabase 特征。

public function test_log_user()
{
    $this->withoutExceptionHandling();

    // $user = User::first();
    $user = User::factory()->create();
    // dd($user);

    $response = $this->post('/login', [
        'email' => $user->email,
        'password' => $user->password, //line 47
    ]);

    $response->getStatusCode();
    // $response->dumpHeaders();
    // $response->dump();
    $response->assertStatus(302);
}

出现此错误:

Illuminate\Validation\ValidationException: The given data was invalid.

C:\xampp\htdocs\react\React-Laravel\vinos-gdl\tests\Feature\AuthTest.php:47

我已经清除了缓存、路由、配置。

phpunit.xml:

<server name="APP_ENV" value="testing"/>
<server name="BCRYPT_ROUNDS" value="4"/>
<server name="CACHE_DRIVER" value="array"/>
<!-- <server name="DB_CONNECTION" value="sqlite"/>
<server name="DB_DATABASE" value=":memory:"/> -->
<server name="MAIL_MAILER" value="array"/>
<server name="QUEUE_CONNECTION" value="sync"/>
<server name="SESSION_DRIVER" value="array"/>
<server name="TELESCOPE_ENABLED" value="false"/>

我还有一个 test_create_user 正确通过了

public function test_create_user()
{
    $this->withoutExceptionHandling();

    $user = [
        'name' => Factory::create()->name(),
        'email' => Factory::create()->email(),
    ];

    $response = $this->post('/register', [
        'name' => $user['name'],
        'email' => $user['email'],
        'password' => Hash::make('123456'),
        'password_confirmation' => Hash::make('123456')
    ]);

    // $response->dumpHeaders();
    // $response->dump();

    $response->assertStatus(302);
}

您的 test_log_user() 函数正在使用您的 user 的已经散列的密码作为表单密码,然后在根据数据库中的值检查之前再次散列该密码。

user factory 将用户的密码字段设置为单词 password 的哈希值(除非您已更改此设置)。例如:

public function definition()
{
    return [
        'name' => $this->faker->name,
        'email' => $this->faker->unique()->safeEmail,
        'email_verified_at' => now(),
        'password' => 'yIXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
        'remember_token' => Str::random(10),
    ];
}

所以在你的 test_log_user() 函数中:

$user = User::factory()->create();

在数据库中创建一个新的 user,并将 yIXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi 作为密码字段中的值(单词 password 的散列)。

所以$user->password的值不是password,而是yIXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi

你要做的是通过以下方式传递明文密码:

$response = $this->post('/login', [
    'email' => $user->email,
    'password' => 'password' 
]);