Auth
假設需要登入才可以發表文章,就要加入認證用的 middleware :
- 直接在 Controller 的 contructor 中用
$this->middleware('auth')
來定義。 - 在
routes.php
上定義['middleware' => 'auth']
。
public function __construct(ArticleRepository $repository)
{
// 除了列表頁外,其他 action 都加入驗證機制
// 參考 App\Http\Kernel.php 裡的 $routeMiddleware
$this->middleware('auth', ['except' => 'index']);
$this->repository = $repository;
}
再次執行測試會失敗,因為我們沒有認證成功。
Laravel 提供以下方式來模擬已經通過身份驗證:
$this->be(new User(['email' => '[email protected]']));
把它放在 TestCase
類別中方便呼叫:
protected function userLoggedIn()
{
$this->be(new User(['email' => '[email protected]']));
}
修正測試:
public function testCreateArticleSuccess()
{
// 把 Session::start 移到 setUp
// 模擬使用者已登入
$this->userLoggedIn();
// 以下不變
// ...
}
public function testCreateArticleFails()
{
// 把 Session::start 移到 setUp
// 模擬使用者已登入
$this->userLoggedIn();
// 以下不變
// ...
}
如果使用者沒登入,可以用以下方法模擬:
public function testAuthFailed()
{
$this->call('POST', 'articles', [
'_token' => csrf_token(),
]);
$this->assertRedirectedTo('auth/login');
}