標準のASP.MVCWebプロジェクトテンプレートに付属している単体テストを見ていると、各アクションメソッドに適切なHttpVerbs属性が設定されているかどうかをテストしていないことに気付きました。
これをリフレクションでテストするのは非常に簡単ですが、問題はそれが努力する価値があるかどうかです。単体テストでHttpVerbsをチェックしますか、それとも統合テストに任せますか?
標準のASP.MVCWebプロジェクトテンプレートに付属している単体テストを見ていると、各アクションメソッドに適切なHttpVerbs属性が設定されているかどうかをテストしていないことに気付きました。
これをリフレクションでテストするのは非常に簡単ですが、問題はそれが努力する価値があるかどうかです。単体テストでHttpVerbsをチェックしますか、それとも統合テストに任せますか?
MvcContrib.TestHelperを使用して、アクションを使用してルートをテストすることもできます。
[TestMethod]
public void ShouldConfirmRouteForNewObjectWithPost()
{
"~/Object/New".WithMethod(HttpVerbs.Post).ShouldMapTo<ObjectController>(x => x.New());
}
他の誰かがこの質問を見つけた場合:ユニットテストですべてのアクションメソッドaccept属性のチェックを開始しました。少し振り返ってみると、うまくいきます。これも実行したい場合のコードは次のとおりです。
protected void CheckAcceptVerbs<TControllerType>(string methodName, HttpVerbs verbs)
{
CheckAcceptVerbs(methodName, typeof(TControllerType).GetMethod(methodName, BindingFlags.Public|BindingFlags.Instance,null,new Type[]{},null), verbs);
}
protected void CheckAcceptVerbs<TControllerType>(string methodName, Type[] ActionMethodParameterTypes, HttpVerbs verbs)
{
CheckAcceptVerbs(methodName, typeof(TControllerType).GetMethod(methodName, BindingFlags.Public | BindingFlags.Instance, null, ActionMethodParameterTypes, null), verbs);
}
private void CheckAcceptVerbs<TControllerType>(string methodName, MethodInfo actionMethod, HttpVerbs verbs)
{
Assert.IsNotNull(actionMethod, "Could not find action method " + methodName);
var attribute =
(AcceptVerbsAttribute)
actionMethod.GetCustomAttributes(false).FirstOrDefault(
c => c.GetType() == typeof(AcceptVerbsAttribute));
if (attribute == null)
{
Assert.AreEqual(HttpVerbs.Get, verbs);
return;
}
Assert.IsTrue(HttpVerbsEnumToArray(verbs).IsEqualTo(attribute.Verbs));
}
最初の方法はパラメーターのないアクションメソッド用で、2番目の方法はパラメーターのあるアクションメソッド用です。3番目のメソッドを直接使用することもできますが、最初の2つのオーバーロードを便利な関数として記述しました。
私の場合、コントローラーの各アクションで適切なAcceptVerbsAttributeを常にチェックしています。
私はそうしませんが、それはあなたがそれについて言及するまでそれが私の心を越えなかったという理由だけです。これからします。