使用 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'
]);
无法通过 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'
]);