過去のエントリー からテスト方法を変更し、
任意の Request を Router に渡し、期待値どおりに dispatch されるかどうかをテストするコードを書きました。
サンプル
final class routesTest extends TestCase
{
// 〜 略 〜
public function DispatchDataProvider()
{
$baseUrl = 'http://localhost:8000';
return [
[
'GET', //=>テスト対象: メソッド
$baseUrl. '/', //=>テスト対象: URL
'Closure', //=>期待値: コントローラ名@アクション名 or Closure
null, //=>期待値: ルート名
],
[
'GET',
$baseUrl. '/home',
HomeController::class . '@index',
'home',
],
];
}
/**
* @dataProvider DispatchDataProvider
* @param $method
* @param $url
* @param $expectedActionName
* @param $expectedRouteName
* @throws \ReflectionException
*/
public function testDispatch(
$method,
$url,
$expectedActionName,
$expectedRouteName
) {
/**
* テスト内容
* 任意の Request を Router に渡して dispatch された Route が期待値通りである事を確認
*/
// Router生成
$router = new \Illuminate\Routing\Router(new Dispatcher());
$this->assertEquals(0, $router->getRoutes()->count(), 'Router に RouteCollection がセットされていない事を確認');
// RouteCollection 取得
// note: \Tests\TestCase の CreatesApplication トレイトで Application が生成される際に、
// routes 以下の設定ファイルで定義された Route が Route ファサードにセットされる
$routeCollection = Route::getRoutes();
// Router に RouteCollection をセット
$router->setRoutes($routeCollection);
$this->assertGreaterThanOrEqual(1, $router->getRoutes()->count(), 'Router に RouteCollection がセットされた事を確認');
// Routerインスタンス の protected メソッドにアクセスする為に Reflection
$reflectionRouter = new \ReflectionClass(get_class($router));
$findRoute = $reflectionRouter->getMethod('findRoute');
$findRoute->setAccessible(true);
// リクエスト生成
$request = \Illuminate\Http\Request::create($url, $method);
// Router に Request を渡し、dispatch された Route を取得
/** @var \Illuminate\Routing\Route $route */
$route = $findRoute->invokeArgs($router, [$request]);
$this->assertEquals(
$expectedActionName,
$route->getActionName(),
'リクエストに対応するコントローラが期待値通りである事'
);
$this->assertEquals(
$expectedRouteName,
$route->getName(),
'リクエストに対応するルート名が期待値通りである事'
);
}
// 〜 略 〜
}
雑感
- 「
RequestをRouterに渡して dispatch 結果をテストする」というテストのサンプルが見当たらなかった為、自分でフレームワークのコードを読んで仕組みを理解して、テストコードを書く、という良い機会になりました。 - 特に今回のテストを書く過程で、リクエストのライフサイクルに関する理解が深まりました。
- これまでフレームワーク自体のテストコードを読む事をしていませんでしたが、テストを読むことがフレームワークを理解する一助になる事を学びました。