Laravel v8での話です。化石を使っています。
Laravelでリクエストを受け取ってゴニョゴニョしているメソッドをテストしたいとき、役に立つのがメソッドインジェクションです。
ここでは詳しく話しませんが、「サービスコンテナ」で調べると色々情報が出てきます。
(Laravel8ですが)
今回はこのメソッドインジェクションを利用して、Request::xxx()
系の処理をテストする方法を紹介したいと思います。
Request::root
Request::root()
と request()->root()
の出力は一緒です。
$this->assertEquals(
request()->root() . "/sample",
Request::root() . "/sample"
);
# => OK
Request::get
リクエスト偽装の方法として、Request::create
を使用します。create するだけでなく、作成したrequestインスタンスをバインドし直して、インスタンスを偽装します。
$request = Request::create('/', 'GET', ['page' => 3]);
$this->app->instance('request', $request);
$this->assertEquals(3, Request::get('page'));
# => OK
以下のような「クエリパラメータの値を参考に前後ページへのリンクタグを生成する」と言ったメソッドのテストに利用できます。
クエリパラメータの値を参考に前後ページへのリンクタグを生成する
function get_pager_link()
{
$tag = '';
$current_index = (int)Request::get('page') ?: 1; // <- コイツを偽装したい
if ($current_index > 1) {
$tag .= '<link href="'. Request::url() .'?page='. ($current_index - 1) . '" />'. PHP_EOL;
}
if ($paginate_object->lastPage() > $current_index) {
$tag .= '<link href="'. Request::url() .'?page='. ($current_index + 1) . '" />';
}
return $tag;
}
public function test_get_pager_link__ページネーションタグ生成テスト()
{
$request = Request::create('/', 'GET', ['page' => 1]);
$this->app->instance('request', $request);
$expectedResult = '<link href="' . Request::root() . '?page=2" />';
$this->assertEquals($expectedResult, get_pager_link());
# => OK
}
Request::server
$request = Request::create('/', 'GET', [], [], [], [
'HTTP_USER_AGENT' => "Mozilla/5.0 (Linux; Android 6.0.1;..."
]);
$this->app->instance('request', $request);
$this->assetEquals(
"Mozilla/5.0 (Linux; Android 6.0.1;...",
Request::server('HTTP_USER_AGENT') // <- コイツを偽装したい
);
# => OK
Request::query
練習でやってみてください。ここまでで説明した内容でできます。
Request::query('utm_source')
$request = Request::create('/', 'GET', ['news' => "smartnews"]);
$this->app->instance('request', $request);
$this->assertEquals("smartnews", Request::query('utm_source')); // <- コイツを偽装したい
# => OK
Request::ip
IPアドレスの偽装は、REMOTE_ADDR パラメータに値を入れます。
$request = Request::create('/', 'GET', [], [], [], ['REMOTE_ADDR' => '182.161.76.40']);
$this->app->instance('request', $request);
$this->assertEquals('182.161.76.40', Request::ip()); // <- コイツを偽装したい
# => OK