我有一个用MSpec编写的规范,用于检查MVC控制器操作是否已标记为HttpPost
属性:
[Subject(typeof(AccountController))]
public class when_user_logs_in : account_controller_spec
{
It can_only_submit_form_via_post = () => {
// some logic to check for HttpPost attribute
};
}
我不确定这是否符合MSpec的使用方式。是否有关于如何检查属性用法的约定?如果没有,是否有更好的方法来命名这样的规范?
答案 0 :(得分:2)
考虑需要执行的操作来检查系统是否显示预期的行为。您如何确保“仅通过POST提交”是可能的?您可能会得出结论,您确实需要使用WatiN或Selenium实现集成测试,并声明在非POST请求方法上显示错误页面(405,方法不允许)。
对于quick'n脏测试,您可以检查附加到AccountController的提交方法的属性。以下是记事本的实现,因为它已经过了我住的午夜:
[Subject(typeof(AccountController))]
public class when_user_logs_in : account_controller_spec
{
static object Attribute;
Because of = () => {
Attribute = typeof(AccountController)
.GetMethod("Submit")
.GetCustomAttributes()
.FirstOrDefault(x => x.Name.Contains = "HttpPost");
};
It can_only_submit_form_via_post = () => {
Attribute.ShouldNotBeNull();
};
}
正如您所看到的,规范并没有真正说明系统的行为。您的生产代码都不会评估Because
代理中的语句。它没有真正的价值,不适合您,也不适合您的客户。这就是为什么我建议在运行时行为上使用WatiN或类似断言的东西而不仅仅是某个属性被打到方法上。
我当然不会手动测试每个与POST相关的控制器动作,因为重复工作太多了。有没有办法找到需要[HttpPost]
的方法的约定?
我记得为我的一个旧的FubuMVC项目实现了一个约定,我们的约定是返回object
(方法签名)的所有控制器操作都将自动限制为POST。代码实际上非常简洁,也许MVC动作过滤器可以为你做同样的事情。