Laravelで単体テスト(WebAPI編)

前回、Laravelでモデル(データベース)のテストをやりました。

今回はWebAPIのテストを行ってみます。

 

演習

以下のようなWebAPIがあったとします。

1.【クライアント側】POST形式で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 を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら

>> Twitter をフォローする

 

-実践知識