[ASP.NET Core] コントローラーの単体テストで Request や Response を使ったメソッドをテストする

こんにちは、kenzauros です。

ASP.NET Core でコントローラーを単体テストするとき、なにもせずにコントローラーをインスタンス化してしまうと ControllerContext が設定されないため、 Request, Response といった 本来の呼び出しでは設定されるはずのコンテキストプロパティが設定されません。

このため、コントローラー内で Response ヘッダーなどを操作していると NullReferenceException が発生してしまいます。

Response.Headers["X-Paging-PageNo"] = page.ToString();

System.NullReferenceException: Object reference not set to an instance of an object.

これを防ぎ、適切にヘッダー等を設定しつつテストする方法を紹介します。

ControllerContext.HttpContext に DefaultHttpContext を設定

基本的にはコントローラーをインスタンス化したあと ControllerContext を作成し、 HttpContext プロパティに DefaultHttpContext を設定すれば OK です。

テストクラス内に下記のようなコントローラーを生成するメソッドを用意しておくとよいと思います。

private HogehogeController CreateController() => new HogehogeController()
    {
        ControllerContext = new ControllerContext
        {
            HttpContext = new Microsoft.AspNetCore.Http.DefaultHttpContext(),
        },
    };

参考

kenzauros