- Windows 10
- PHP 7.4.5
- Laravel Framework 7.9.2
LaravelでのAPIサーバー開発において、認証つきサービスの試験をUnitテストで実装します。
JWT認証の構築や、Unitテストの準備などについては、それぞれ下記の記事をご参照ください。
- LaravelでのJWT認証
- Laravelの認証でwebとapiの両方を使う
- LaravelでのUnitテストざっくり入門
- APIサーバー:https://develop.sankosc.co.jp/apitest/
このサーバーをベースにして、認証中にアクセスできるAPIhttp://localhost/api/me
へアクセスし、ユーザー情報を取得するテストコードを実装したいと思います。
テストコードの前処理でログインする
- ログインユーザーを作成
- ログインAPIでアクセストークン取得
- アクセストークンを変数に保存しておく
ExampleFutureTest.php
<?php
namespace Tests\Feature;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Support\Facades\Hash;
use Tests\TestCase;
use App\User;
class ExampleFeatureTest extends TestCase
{
use RefreshDatabase;
private $accessToken = null;
protected function setUp(): Void // ※ Voidが必要
{
// 必ずparent::setUp()を呼び出す
parent::setUp();
// 1.ログインユーザー作成
User::create([
'name' => 'sample user',
'email' => 'sample@sankosc.co.jp',
'password' => Hash::make('sample123'),
]);
// 2.ログインAPIでアクセストークン取得
$response = $this->post('/api/login', [
'email' => 'sample@sankosc.co.jp',
'password' => 'sample123'
]);
$response->assertOk();
// 3.アクセストークンを変数に保存しておく
$this->accessToken = $response->decodeResponseJson('access_token');
}
}
認証が必要なAPIのテストケースを実装する
- 認証が必要なAPIにアクセスするときにヘッダにアクセストークンを含める
ExampleFutureTest.php
/**
* @test
* @group testing
*/
public function getWithAuth()
{
$response = $this->get('/api/me', [
'Authorization' => 'Bearer '.$this->accessToken
]);
$response->assertOk()->assertJsonFragment([
'name' => 'sample user'
]);
}
テスト実行
> .\vendor\bin\phpunit --group=testing
PHPUnit 8.5.4 by Sebastian Bergmann and contributors.
. 1 / 1 (100%)
Time: 766 ms, Memory: 28.00 MB
OK (1 test, 3 assertions)