Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 您是否在单元测试中检查HttpVerbs?_Asp.net Mvc_Unit Testing_Tdd_Httpverbs - Fatal编程技术网

Asp.net mvc 您是否在单元测试中检查HttpVerbs?

Asp.net mvc 您是否在单元测试中检查HttpVerbs?,asp.net-mvc,unit-testing,tdd,httpverbs,Asp.net Mvc,Unit Testing,Tdd,Httpverbs,在查看标准ASP.MVC Web项目模板附带的单元测试时,我注意到这些测试不会测试是否在每个操作方法上设置了正确的HttpVerbs属性 用反射来测试这一点很容易,但问题是它是否值得付出努力。您是在单元测试中检查HttpVerbs,还是将其留给集成测试?至于我,我一直在检查控制器中每个动作的正确AcceptVerbsAttribute。我没有检查,但这只是因为在您提到它之前,我没有想到它。我将从现在开始。以防其他人发现这个问题:我已经开始检查我的单元测试中的所有action-method-acc

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


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

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

我没有检查,但这只是因为在您提到它之前,我没有想到它。我将从现在开始。

以防其他人发现这个问题:我已经开始检查我的单元测试中的所有action-method-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));
}
受保护的void CheckAcceptVerbs(字符串方法名,HttpVerbs)
{              
CheckAcceptVerbs(methodName,typeof(TControllerType).GetMethod(methodName,BindingFlags.Public | BindingFlags.Instance,null,new-Type[]{},null),verbs);
}
受保护的void CheckAcceptVerbs(字符串方法名称,类型[]ActionMethodParameterTypes,HttpVerbs)
{
CheckAcceptVerbs(methodName,typeof(TControllerType).GetMethod(methodName,BindingFlags.Public | BindingFlags.Instance,null,ActionMethodParameterTypes,null),verbs);
}
私有void CheckAcceptVerbs(字符串methodName、MethodInfo actionMethod、HttpVerbs)
{
Assert.IsNotNull(actionMethod,“找不到操作方法”+methodName);
变量属性=
(AcceptVerbsAttribute)
actionMethod.GetCustomAttributes(false).FirstOrDefault(
c=>c.GetType()==typeof(AcceptVerbsAttribute));
if(属性==null)
{
Assert.AreEqual(HttpVerbs.Get,verbs);
返回;
}
Assert.IsTrue(HttpVerbsEnumToArray(动词).IsEqualTo(attribute.verbs));
}

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

您还可以使用MvcContrib.TestHelper来测试带有操作的路由

    [TestMethod]
    public void ShouldConfirmRouteForNewObjectWithPost()
    {
        "~/Object/New".WithMethod(HttpVerbs.Post).ShouldMapTo<ObjectController>(x => x.New());
    }
[TestMethod]
public void应使用post()确认ForneWobjects的路由
{
“~/Object/New”.WithMethod(HttpVerbs.Post).ShouldMapTo(x=>x.New());
}

我认为“asp.net mvc”标签比两个单独的“asp.net”和“mvc”标签要好。谢谢大家的提醒。不确定这是否是回复率低的原因,但这不会有什么坏处。在我浏览asp.net-mvc标记的问题时,这有帮助(重新标记),这就是我如何偶然发现你的(好!)问题的原因。哦,在这种情况下,你可能会发现我答案中的代码很有用。