首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用PHPunit在Laravel上测试登录脚手架

用PHPunit在Laravel上测试登录脚手架
EN

Stack Overflow用户
提问于 2021-01-23 20:51:48
回答 1查看 136关注 0票数 0

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

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

我还尝试用bcrpyt()Hash::make密码硬编码凭据--在那里,错误似乎也会发生。

我不是在利用RefreshDatabase的特质。

代码语言:javascript
复制
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);
}

获取此错误:

说明\ValidationException:给定数据无效。C:\xampp\htdocs\react\React-Laravel\vinos-gdl\tests\Feature\AuthTest.php:47

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

phpunit.xml:

代码语言:javascript
复制
<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

代码语言:javascript
复制
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);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-24 00:13:09

您的test_log_user()函数使用user的已散列密码作为表单密码,然后在对照数据库中的值进行检查之前再次对其进行散列。

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

代码语言:javascript
复制
public function definition()
{
    return [
        'name' => $this->faker->name,
        'email' => $this->faker->unique()->safeEmail,
        'email_verified_at' => now(),
        'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
        'remember_token' => Str::random(10),
    ];
}

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

代码语言:javascript
复制
$user = User::factory()->create();

在数据库中创建一个新的user$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi作为密码字段中的值(单词password的散列)。

所以$user->password的值不是password,而是$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi

您要做的是将明文密码传递给:

代码语言:javascript
复制
$response = $this->post('/login', [
    'email' => $user->email,
    'password' => 'password' 
]);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65864249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档