いろいろな Hello World!
Response の基礎
問題
以下のようなページを作成してください。
GET /textにアクセスすると、 Content-Type がtext/plain形式でHello World!が表示されるGET /jsonにアクセスすると、 Content-Type がapplication/json形式で{"greet":"Hello World!"}が表示されるGET /htmlにアクセスすると、 Content-Type がtext/html形式で赤い文字のHello World!が表示される
問題は、以下の手順で解いてください。
- Red:小さいテストを作成し、失敗を確認してください
- Green:テストを成功させてください
- Refactor:整理・整頓してください
- 必要に応じて、1から3を繰り返してください
ヒント
背景知識
- 公式ドキュメントの Responses
- 或るリクエストの一生
便利なアサーションの例
アサーションの調べ方 も合わせてご覧ください。
今回は、以下を使うのではないかと思います。
-
assertSeeText($value)(HTTP テスト : テキストコンテンツに $value が含まれるか)
解答例
続きを読む
実行環境:
- Laravel v13.12.0
- PHP 8.4
- PHPUnit
Red1: /text
テストを作成します。
bash:
php artisan make:test ResponseTest
tests/Feature/ResponseTest.php:
<?php
namespace Tests\Feature;
use Tests\TestCase;
class ResponseTest extends TestCase
{
public function test_plain_textを表示(): void
{
$response = $this->get('/text');
$response->assertStatus(200)
->assertHeaderContains('Content-Type', 'text/plain')
->assertSeeText('Hello World!');
}
}
テストの失敗を確認します。
Green1
ルーティングファイルを編集します。
routes/web.php:
use Illuminate\Support\Facades\Route;
Route::get('/text', function () {
return response('Hello World!')
->header('Content-type', 'text/plain');
});
テストの成功を確認します。
Refactor1
リファクタリングは特に有りません。
Red2: /json
テストを追加します。
tests/Feature/ResponseTest.php:
public function test_jsonを表示(): void
{
$response = $this->get('/json');
$response->assertStatus(200)
->assertHeaderContains('Content-Type', 'application/json')
->assertJsonPath('greet', 'Hello World!');
}
テストの失敗を確認します。
Green2
ルーティングを追加します。
routes/web.php:
Route::get('/json', function () {
return ['greet' => 'Hello World!'];
});
テストの成功を確認します。
Refactor2
リファクタリングは特に有りません。
Red3: /html
テストを追加します。
tests/Feature/ResponseTest.php:
public function test_htmlを表示(): void
{
$response = $this->get('/html');
$response->assertStatus(200)
->assertHeaderContains('Content-Type', 'text/html')
->assertSee('color:red', false)
->assertSeeText('Hello World!');
}
テストの失敗を確認します。
Green3
ルーティングを追加します。
routes/web.php:
Route::get('/html', function () {
return '<div style="color:re">Hello World!</div>';
});
テストの成功を確認します。
Refactor3
リファクタリングは特に有りません。
解説
続きを読む
Response メソッドについて
リクエストのライフサイクルを知っておくことは重要です。
詳細は: 或るリクエストの一生 にあります。
今回は、その中の Response オブジェクトについての問題でした。
ルーティングで渡されるコントローラーのメソッドで、戻り値として文字列を返すと、自動的に Response オブジェクトにかえて、 text/html の Response を作成してくれます。
配列を返せば、 json にしてくれます。
text/plain にしたい場合など、直接 Response オブジェクトを操作するメソッドもあります。
また、将来的には、Blade や Inertia などの view を使うことで、表示をファイルに分けて作成できるようにもなります。