Соответствует ли эта спецификация, проверяющая использование атрибутов, предполагаемому использованию MSpec? - PullRequest
1 голос
/ 14 января 2012

У меня есть спецификация, написанная в 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 Ответ

2 голосов
/ 14 января 2012

Подумайте о действии, которое необходимо выполнить, чтобы проверить, показывает ли система предполагаемое поведение.Как бы вы попытались убедиться, что «только отправка через POST» возможна?Вы можете прийти к выводу, что вам действительно нужно реализовать интеграционный тест с использованием WatiN или Selenium, и утверждать, что страница ошибки (405, метод не разрешен) отображается в методе запроса, отличном от POST.

Для быстрогоВ грязном тесте вы можете проверить атрибуты, прикрепленные к методу отправки 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 или что-то похожее на assert в поведении во время выполнения, а не просто какой-то атрибут, добавленный к методу.

Я бы точно не проверял каждое действие контроллера, связанное с POST, так как это слишком многократно повторяетсяРабота.Есть ли способ найти соглашение для методов, которые требуют [HttpPost]?

Я помню, как реализовывал соглашение для одного из моих старых проектов FubuMVC, где у нас было соглашение, что все действия контроллера, которые возвращают object (подпись метода) будет автоматически ограничена POST.Код был довольно лаконичен, возможно, фильтр действий MVC может сделать то же самое для вас.

...