前回、Laravelでモデル(データベース)のテストをやりました。
Laravelで単体テスト(データベース編|簡易バージョン)
今回はWebAPIのテストを行ってみます。
演習
以下のようなWebAPIがあったとします。
2.【API側】送信されたデータに問題がなければJSON形式で結果をレスポンス
問題のない、もしくは問題のあるデータをそれぞれWebAPIに送信してみて、きちんとJSON形式で結果が返ってくるかテストします。
手順
ルーティング
Route::post('v1/login, 'UserController@login');
CSRFを無効
LaravelではデフォルトでCSRF対策がされています。
しかしWebAPIとして構築するなら、外部からのPOST送信をされた場合、CSRFでエラーになります。
なので、これを特定のURLだけCSRFの対象外にしてやる必要があります。
app\Http\Middleware\VerifyCsrfToken.php
を開きます。(Laravel5.2)
protected $except = [
'v1/*'
];
コントローラ
artisanコマンドでコントローラのスケルトンを作成。
$ php artisan make:controller UserController
POST送信されたリクエストを検証してJSON形式で返すコードを記述します。
:
public function login(Request $request)
{
// データ検証作業
// 実際はデータベースのテーブルを呼び出して検証作業を行う
if($request['email'] == 'test@test.com' and $request['password'] == 'test_password')
{
$result = 'OK';
}else{
$result = 'Error';
}
// レスポンスをJSON形式で返す
$response = response()->json(
[
'result' => $result
]
);
return $response;
}
テストコードの作成
artisanコマンドでテストコードのスケルトンを作成
php artisan make:test SimpleApiTest
自動生成されたテストファイルの中をコーディングしていきます。
:
public function testExample()
{
// 正常動作確認
$responsePost = $this->call('POST', '/v1/login', ['email' => 'test@test.com','password' => 'test_password']);
$this->assertEquals(200, $responsePost->getStatusCode());
$obj = $responsePost->getData();
$this->assertEquals($obj->result,'OK');
// エラー動作確認
$responsePost = $this->call('POST', '/v1/login', ['email' => 'demo@demo.com','password' => 'demo_password']);
$this->assertEquals(200, $responsePost->getStatusCode());
$obj = $responsePost->getData();
$this->assertEquals($obj->result,'Error');
}
:
解説
ここではログインの正常動作とエラー動作だけの動作確認を行いました。
実際のテストでは新規登録・更新・削除といった動作確認をテストすることが多いです。
テストの実行
$ ./vendor/bin/phpunit tests/SimpleApiTest.php
上記のように "OK" が表示されていたら、コード自体には問題がないことが確認できます。
ここまでテストをすれば、もし、フォームからPOST送信をしてエラーが出ても、問題の切り分けが素早くできますね。
以上です。
仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら。