2012-01-13 4 views
1

У меня есть спецификации написано в MSpec, который проверяет, имеют ли MVC контроллер действия были отмечены HttpPost атрибута:Соответствует ли эта спецификация проверке использования атрибута предполагаемым использованием MSpec?

[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 предназначен для использования. Существует ли соглашение об использовании атрибута? Если нет, есть ли лучший способ назвать такую ​​спецификацию?

ответ

2

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

Для быстрого пробного тестирования вы можете проверить атрибуты, прикрепленные к методу отправки AccountController. Ниже приводится реализация Notepad, как это хорошо за полночь, где я живу:

[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 может сделать то же самое для вас.

+0

Если вас интересуют спецификации (тесты модулей) для поведения FubuMVC, я имел в виду: https://gist.github.com/1610214 –