你在单元测试中检查HttpVerbs吗?

时间:2009-06-25 10:26:13

标签: asp.net-mvc unit-testing tdd httpverbs

在查看标准ASP.MVC Web项目模板附带的单元测试时,我注意到这些测试不会测试是否在每个操作方法上设置了正确的HttpVerbs属性。

用反射测试这个很容易,但问题是它是否值得付出努力。你在单元测试中检查HttpVerbs,还是将其留给集成测试?

4 个答案:

答案 0 :(得分:2)

你也可以使用MvcContrib.TestHelper来测试带有动作的路线。

    [TestMethod]
    public void ShouldConfirmRouteForNewObjectWithPost()
    {
        "~/Object/New".WithMethod(HttpVerbs.Post).ShouldMapTo<ObjectController>(x => x.New());
    }

答案 1 :(得分:1)

如果其他人发现了这个问题:我已经开始检查我的单元测试中的所有操作方法接受属性。有点反思就可以了。如果您还想这样做,可以使用以下代码:

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 :(得分:0)

至于我,我总是在我的控制器中检查每个动作的正确AcceptVerbsAttribute。

答案 3 :(得分:0)

我没有,但这只是因为在你提到它之前我没有想到它。我会从现在开始。