使用MSpec测试ActionFilterAttributes

Tom*_*han 5 asp.net-mvc bdd mspec action-filter

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

我正在编写一个ASP.NET MVC应用程序,我想实现PRG.上次我这样做,我用行动过滤器出口和进口ModelState通过TempData,这样我就可以返回RedirectResult和验证错误仍然会存在,当用户拿到的看法.我通过验证两件事测试了这个场景:

a)我编写的ExportModelStateAttribute已应用(在我的控制器的测试中)
b)该属性有效(在动作过滤器属性的测试中)

然而,在BDD中,我知道我应该更关注行为,甚至更少关注实现.这意味着我可能只需要在动作执行完毕后验证模型状态是否在tempdata中 - 不一定是通过属性完成的.

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

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

Nea*_*eal 1

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

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

顺便说一句: ASP.NET MVC 的设计约定是在模型状态包含错误时返回视图。在这些场景中使用 PRG 确实有意义,因为 PRG 旨在停止重复的表单提交和处理(即有效请求)。当用户发布无效表单时,您会在开始处理请求之前检查错误,从而停止处理用户请求。