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

匿名 (未验证) 提交于 2019-12-02 22:11:45

在 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');

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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!