在查看标准 ASP.MVC Web 项目模板附带的单元测试时,我注意到这些单元测试并没有测试是否在每个操作方法上设置了正确的 HttpVerbs 属性。
用反射来测试这个很容易,但问题是它是否值得付出努力。您是在单元测试中检查 HttpVerbs,还是将其留给集成测试?
在查看标准 ASP.MVC Web 项目模板附带的单元测试时,我注意到这些单元测试并没有测试是否在每个操作方法上设置了正确的 HttpVerbs 属性。
用反射来测试这个很容易,但问题是它是否值得付出努力。您是在单元测试中检查 HttpVerbs,还是将其留给集成测试?
您还可以使用 MvcContrib.TestHelper 来测试带有操作的路由。
[TestMethod]
public void ShouldConfirmRouteForNewObjectWithPost()
{
"~/Object/New".WithMethod(HttpVerbs.Post).ShouldMapTo<ObjectController>(x => x.New());
}
如果其他人发现这个问题:我已经开始在我的单元测试中检查我所有的操作方法接受属性。一点反思就可以了。如果您也想这样做,这里有一些代码:
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));
}
第一种方法适用于无参数的动作方法,第二种方法适用于有参数的动作方法。您也可以直接使用第三种方法,但我将前两个重载编写为方便函数。
我没有,但那只是因为在你提到它之前我没有想到它。从现在开始我会的。
至于我,我总是在控制器中的每个操作上检查正确的 AcceptVerbsAttribute。