欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Laravel 单元测试-模拟认证的用户

程序员文章站 2022-09-03 23:35:55
在 Laravel 编写单元测试时经常会遇到需要模拟认证用户的时候,比如新建文章、创建订单等,那么在 Laravel unit test 中如何来实现呢? 官方解决方法 Laravel 的官方文档中的测试章节中有提到: Of course, one common use of the session ......

在 laravel 编写单元测试时经常会遇到需要模拟认证用户的时候,比如新建文章、创建订单等,那么在 laravel unit test 中如何来实现呢?

官方解决方法

laravel 的官方文档中的测试章节中有提到:

of course, one common use of the session is for maintaining state for the authenticated user. the actingas helper method provides a simple way to authenticate a given user as the current user. for example, we may use a model factory to generate and authenticate a user:

<?php

use app\user;

class exampletest extends testcase
{
    public function testapplication()
    {
        $user = factory(user::class)->create();

        $response = $this->actingas($user)
                         ->withsession(['foo' => 'bar'])
                         ->get('/');
    }
}

其实就是使用 laravel testing illuminate\foundation\testing\concerns\impersonatesusers trait 中的 actingasbe 方法。

设置以后在后续的测试代码中,我们可以通过 auth()->user() 等方法来获取当前认证的用户。

伪造认证用户

在官方的示例中有利用 factory 来创建一个真实的用户,但是更多的时候,我们只想用一个伪造的用户来作为认证用户即可,而不是通过 factory 来创建一个真实的用户。

在 tests 目录下新建一个 user calss:

use illuminate\foundation\auth\user as authenticatable;

class user extends authenticatable
{
    protected $fillable = [
        'id', 'name', 'email', 'password',
    ];
}

必须在 $fillable 中添加 id attribute . 否则会抛出异常: illuminate\database\eloquent\massassignmentexception: id

接下来伪造一个用户认证用户:

$user = new user([
    'id' => 1,
    'name' => 'ibrand'
]);

 $this->be($user,'api');

后续会继续写一些单元测试小细节的文章,欢迎关注 : )

讨论交流

Laravel 单元测试-模拟认证的用户