验证属性使用的此规范是否符合MSpec的预期用途?

时间:2012-01-13 22:43:15

标签: c# naming-conventions mspec specifications

我有一个用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的使用方式。是否有关于如何检查属性用法的约定?如果没有,是否有更好的方法来命名这样的规范?

1 个答案:

答案 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动作过滤器可以为你做同样的事情。