Laravel6.0.4がリリースされました。
Releases · laravel/framework
機能の追加は次の通りです。
Added
- Added
TestResponse::assertJsonPath()method (#29957) - Added
hasMacro\getGlobalMacro\hasGlobalMacromethods toEloquent Builder(#30008) - Added
Illuminate\Database\Eloquent\Relations\BelongsToMany::getPivotColumns()method (#30049) - Added
ScheduledTaskFinished\ScheduledTaskStartingevents to signal when scheduled task runs (#29888) - Allowing adding command arguments and options with
InputArgument\InputOptionobjects (#29987)
自分にとって特別な追加はTestResponse::assertJsonPath()です。これのおかげでAPIのミドルウェア込みテスト(疑似的なリクエストを投げて、ルーターとコントローラを通して、レスポンスを返してもらって、レスポンスをチェック)をより簡潔に必要な分だけ作れる様になりました。
LaravelのTestCaseではAPI用にJSONレスポンス用のassertが用意されています。もともと用意されていたのは大規模にならざるを得ないメソッドや素朴すぎるメソッドです。例えば、assertExactJsonがあります。これは完全一致のJSONを期待するassertで次のように使います。
$this->getJson(route('api.post.show', [$post->id]))
->assertExactJson([
'title' => 'My blog post',
'body' => 'Lorem ipsum ...',
'tags' => [],
'comments' => [
[
'body' => 'First!',
'user_id' => 42,
'user' => [
'id' => 42,
'username' => 'ecrmnn',
],
],
[
'body' => 'This is my comment',
'user_id' => 731,
'user' => [
'id' => 731,
'username' => 'ventrec',
],
],
],
]);
これはこれで便利なのですが、細かい単位でテストし難いです。また、同じコントローラメソッドを繰り返しテストすると微妙な差分の期待するJSON定義が膨らみます。もっと言えば、何をテストしたいのかぱっと見分かりません。Laravel6.0.4で追加されたassertJsonPathはこれを解決します。次のコードの様に、JSONの特定のパスについてのみassertをすることで簡潔に必要な分だけ検査をできます。先述のassertExactJsonをassertJsonPathに書き直すと次のようになります。
$this->getJson(route('api.post.show', [$post->id]))
->assertJsonPath('tags', [])
->assertJsonPath('comments.0.user.username', 'ecrmnn')
->assertJsonPath('comments.*.body', [
'First!',
'This is my comment',
]);
ちなみにJSONレスポンスを期待する疑似リクエストを投げる時のコードは次のようになります。get, postのみならずput等HTTP2.0で定義されるメソッドにも対応しています。
class HogeControllerTest extends TestCase
{
public function HogeTest(){
$this->getJson(route('hoge'));
$this->postJson(route('hoge'), ['id' => 0, 'password' => '']);
$this->deleteJson(route('hoge'), ['id' => 0]);
}
}