我有一个用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的使用方式。对于如何检查属性用法,是否有一个约定?如果不是,有没有更好的方法来命名这样的规范?
发布于 2012-01-14 12:01:04
考虑为检查系统是否显示预期行为而需要执行的操作。你将如何确保“只能通过帖子提交”?您可能会得出这样的结论:您实际上需要使用WatiN或Selenium实现集成测试,并断言在非POST请求方法上显示了一个错误页面(405,不允许使用方法)。
为了进行快速测试,您可以检查附加到AccountController的submit方法的属性。下面是一个记事本的实现,因为我住的地方已经过了午夜了:
[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或类似于assert的东西,而不仅仅是一些附加到方法上的属性。
我当然不会手动测试每个与POST相关的控制器操作,因为这是太多的重复工作。有没有办法为需要[HttpPost]的方法找到一个约定?
我记得为我的一个较老的FubuMVC项目实现了一个约定,其中我们有一个约定,即所有返回object (方法签名)的控制器操作将自动限制为POST。代码实际上非常简洁,也许MVC操作筛选器可以为您做同样的事情。
https://stackoverflow.com/questions/8858256
复制相似问题