【问题标题】:Do you check HttpVerbs in your unit tests?你在单元测试中检查 HttpVerbs 吗?
【发布时间】:2010-11-05 19:12:46
【问题描述】:

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

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

【问题讨论】:

  • 我认为“asp.net-mvc”标签比两个单独的“asp.net”和“mvc”标签要好。
  • 感谢您的提醒。不知道这是否是响应率低的原因,但它不会受到伤害。
  • 当我浏览 asp.net-mvc 标记的问题时,它帮助(重新标记),这就是我偶然发现您的(好!)问题的原因。

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


【解决方案1】:

对于我来说,我总是在我的控制器中的每个操作上检查正确的 AcceptVerbsAttribute。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 哦,在这种情况下,您可能会发现我的答案中的代码很有用。
    【解决方案3】:

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

    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));
    }
    

    第一种方法适用于无参数的动作方法,第二种方法适用于有参数的动作方法。您也可以直接使用第三种方法,但我将前两个重载编写为方便函数。

    【讨论】:

      【解决方案4】:

      您还可以使用 MvcContrib.TestHelper 通过操作来测试路由。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-05
        • 1970-01-01
        • 2010-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-16
        • 2019-05-12
        相关资源
        最近更新 更多