Asp.net mvc 用MSpec测试ActionFilterAttribute
我目前正试图掌握MSpec,主要是为了学习(T/B)DD的新方法,以便能够就使用哪种技术做出明智的决定。以前,我主要(只读)使用内置的MSTest框架和Moq,所以BDD对我来说是非常新的 我正在编写一个ASP.NETMVC应用程序,我想实现它。上次我这样做时,我使用动作过滤器通过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(在控
TempData
导出和导入ModelState
,这样我就可以返回重定向结果
,当用户获得视图时验证错误仍然存在。我通过验证两件事来测试该场景:
a) 已应用我编写的ExportModelStateAttribute(在控制器的测试中)b) 属性是否有效(在操作筛选器属性的测试中) 然而,在BDD中,我明白我应该更加关注行为,而更少关注实现。这意味着我可能应该在操作完成时验证模型状态是否在tempdata中,而不一定是通过属性完成的 更复杂的是,在测试中直接调用操作时,属性不会运行,因此我不能只调用操作,然后查看任务是否完成
我应该如何在MSpec中对此进行规范/测试?过滤器是交叉关注点,因此,您应该独立于应用过滤器的位置来测试过滤器的行为(否则会重复大量测试) 您仍然可以在控制器测试中表示所需的行为(模型状态存储在临时数据中),但测试可以断言属性的存在(可能封装在行为中?) 作为旁白:
ASP.NET MVC的设计惯例是,如果模型状态包含错误,则返回视图。在这些场景中使用PRG是有意义的,因为PRG旨在停止重复表单提交和处理(即有效请求)。当用户发布无效表单时,在开始处理请求之前检查错误,从而停止处理用户请求。OK。所以基本上你建议我定义一个行为,说“在临时数据中存储模型状态”,但实际上只是检查属性是否被应用,然后在一个完全不同的测试上下文中为属性定义测试?是的。您多次测试预期的行为(what),一次测试该行为(how)的实现。现在,还有一个后续问题:在我以前测试是否应用了属性的方法中,我使用反射并将表达式和类型传递给测试方法。在指定行为时,我无法找到传递这些参数的方法。(类型可以通过使行为类成为泛型或其他方式来确定,但我仍然需要一个lambda…)我如何做到这一点?在“建立”中,获取正在测试的操作的MethodInfo。在中,获取使用GetCustomAttributes应用的属性集合。在规范中,断言集合的长度不应为零。Neil是正确的。属性是交叉关注点,但实际上可以通过BDD上下文中的反射来测试它们