tekitoumemo’s diary

思ったことを書くだけ。長文版Twitter

【ASP.NET WEB API、MsTest】アノテーションをテストする



テストで正常パターン、異常パターンなど様々なテストを書くと思いますが、アノテーションのエラーを取るやり方が日本語で載ってなかったので書きます。stack traceでは以下に載ってました。

ASP.NETではアノテーションで大体のエラー処理が行えるのでめっちゃ楽なんですが、通常のメソッド呼び出しだとアノテーションが効きません。なので、アノテーションを効かせるコードを紹介します。

まず、アノテーションとはどういうものなのか?

アノテーション(英語:annotation)とは、あるデータに対して関連する情報(メタデータ)を注釈として付与すること。

ASP.NETでは、以下のように空白チェック、数値チェックなど、モデルのプロパティで自動に検知出来る仕組みがあります。

    public class Models
    {
        [Required(ErrorMessage = "Hoge1がない!")]
        public string Hoge1 { get; set; }
        [RegularExpression(@"[0-9]+", ErrorMessage = "Hoge2が数字じゃない!")]
        public string Hoge2 { get; set; }
    }

こんな感じのやつです。

上記のモデルを使い、このメソッドをテストします。

        // POST api/values
        public void Post(Models value)
        {

        }

で、次にMsTestでどう検知するか以下に記載します。

        [TestMethod]
        public void Post()
        {
            // 準備
            ValuesController controller = new ValuesController();
            var json = File.ReadAllText("json1.json");
            var model = JsonConvert.DeserializeObject<Models>(json);
            controller.Configuration = new HttpConfiguration();
            controller.Validate<Models>(model);
            // バリデーションが取得可
            //controller.ModelState
        }

まず、HttpServerのインスタンスを作成するためにcotroller.ConfigurationにHttpConfigurationを設定します。そのあとにcontroller.Validateにジェネリックで型とモデルを渡します。そうするとModelStateにエラーが検知され、assertやらなんやらでテストを書けば終了です。

これである程度のテストはなんとかなりました。

ちなみに

テストを書いててめんどいのが、webサイトのパスが取れんこと。以下のようなコードは当然取れないので諦めてカスタムビルドを作ってテスト用に作るしかないという結論に至りました。テストに関してはあまりわかってないからいい方法があるかも

HttpContext.Current.Server.MapPath("./")