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');
後續會繼續寫一些單元測試小細節的文章,歡迎關注 : )