Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.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 用MSpec测试ActionFilterAttribute_Asp.net Mvc_Bdd_Action Filter_Mspec - Fatal编程技术网

Asp.net mvc 用MSpec测试ActionFilterAttribute

Asp.net mvc 用MSpec测试ActionFilterAttribute,asp.net-mvc,bdd,action-filter,mspec,Asp.net Mvc,Bdd,Action Filter,Mspec,我目前正试图掌握MSpec,主要是为了学习(T/B)DD的新方法,以便能够就使用哪种技术做出明智的决定。以前,我主要(只读)使用内置的MSTest框架和Moq,所以BDD对我来说是非常新的 我正在编写一个ASP.NETMVC应用程序,我想实现它。上次我这样做时,我使用动作过滤器通过TempData导出和导入ModelState,这样我就可以返回重定向结果,当用户获得视图时验证错误仍然存在。我通过验证两件事来测试该场景: a) 已应用我编写的ExportModelStateAttribute(在控

我目前正试图掌握MSpec,主要是为了学习(T/B)DD的新方法,以便能够就使用哪种技术做出明智的决定。以前,我主要(只读)使用内置的MSTest框架和Moq,所以BDD对我来说是非常新的

我正在编写一个ASP.NETMVC应用程序,我想实现它。上次我这样做时,我使用动作过滤器通过
TempData
导出和导入
ModelState
,这样我就可以返回
重定向结果
,当用户获得视图时验证错误仍然存在。我通过验证两件事来测试该场景:

a) 已应用我编写的ExportModelStateAttribute(在控制器的测试中)
b) 属性是否有效(在操作筛选器属性的测试中)

然而,在BDD中,我明白我应该更加关注行为,而更少关注实现。这意味着我可能应该在操作完成时验证模型状态是否在tempdata中,而不一定是通过属性完成的

更复杂的是,在测试中直接调用操作时,属性不会运行,因此我不能只调用操作,然后查看任务是否完成


我应该如何在MSpec中对此进行规范/测试?

过滤器是交叉关注点,因此,您应该独立于应用过滤器的位置来测试过滤器的行为(否则会重复大量测试)

您仍然可以在控制器测试中表示所需的行为(模型状态存储在临时数据中),但测试可以断言属性的存在(可能封装在行为中?)

作为旁白:
ASP.NET MVC的设计惯例是,如果模型状态包含错误,则返回视图。在这些场景中使用PRG是有意义的,因为PRG旨在停止重复表单提交和处理(即有效请求)。当用户发布无效表单时,在开始处理请求之前检查错误,从而停止处理用户请求。

OK。所以基本上你建议我定义一个行为,说“在临时数据中存储模型状态”,但实际上只是检查属性是否被应用,然后在一个完全不同的测试上下文中为属性定义测试?是的。您多次测试预期的行为(what),一次测试该行为(how)的实现。现在,还有一个后续问题:在我以前测试是否应用了属性的方法中,我使用反射并将表达式和类型传递给测试方法。在指定行为时,我无法找到传递这些参数的方法。(类型可以通过使行为类成为泛型或其他方式来确定,但我仍然需要一个lambda…)我如何做到这一点?在“建立”中,获取正在测试的操作的MethodInfo。在中,获取使用GetCustomAttributes应用的属性集合。在规范中,断言集合的长度不应为零。Neil是正确的。属性是交叉关注点,但实际上可以通过BDD上下文中的反射来测试它们