Laravel 单元测试-模拟认证的用户
在 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 中的 actingas
和 be
方法。
设置以后在后续的测试代码中,我们可以通过 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');
后续会继续写一些单元测试小细节的文章,欢迎关注 : )
讨论交流
上一篇: C++编译错误杂记
下一篇: Django 使用allauth报错