5

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

我正在编写一个 ASP.NET MVC 应用程序,并且我想实现PRG。上次我这样做时,我使用操作过滤器通过 导出和导入ModelStateTempData这样我就可以返回 aRedirectResult并且当用户获得视图时验证错误仍然存​​在。我通过验证两件事来测试该场景:

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

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

更复杂的是,在测试中直接调用动作时属性不会运行,所以我不能只调用动作并查看工作是否完成。

我应该如何在 MSpec 中规范/测试这个?

4

1 回答 1

1

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

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

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

于 2010-05-31T01:55:07.647 回答