在 Laravel 編寫單元測試時常常會遇到須要模擬認證用戶的時候,好比新建文章、建立訂單等,那麼在 Laravel unit test 中如何來實現呢?php
Laravel 的官方文檔中的測試章節中有提到:api
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:session
<?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
方法。ide
設置之後在後續的測試代碼中,咱們能夠經過 auth()->user()
等方法來獲取當前認證的用戶。單元測試
在官方的示例中有利用 factory 來建立一個真實的用戶,可是更多的時候,咱們只想用一個僞造的用戶來做爲認證用戶便可,而不是經過 factory 來建立一個真實的用戶。測試
在 tests 目錄下新建一個 User
calss:this
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
code
接下來僞造一個用戶認證用戶:文檔
$user = new User([ 'id' => 1, 'name' => 'ibrand' ]); $this->be($user,'api');
後續會繼續寫一些單元測試小細節的文章,歡迎關注 : )get