Вы проверяете HttpVerbs в своих модульных тестах?
Рассматривая модульные тесты, которые поставляются со стандартным шаблоном веб-проекта ASP.MVC, я заметил, что они не проверяют, установлен ли правильный атрибут HttpVerbs для каждого метода действия.
Это очень легко проверить с помощью рефлексии, но вопрос в том, стоит ли это того. Вы проверяете HttpVerbs в своем модульном тесте или оставляете это на интеграционное тестирование?
4 ответа
В случае, если кто-то еще найдет этот вопрос: я начал проверять все мои методы действия принимают атрибуты в моих модульных тестах Немного размышлений делает трюк просто отлично. Вот некоторый код, если вы хотите сделать это также:
protected void CheckAcceptVerbs<TControllerType>(string methodName, HttpVerbs verbs)
{
CheckAcceptVerbs(methodName, typeof(TControllerType).GetMethod(methodName, BindingFlags.Public|BindingFlags.Instance,null,new Type[]{},null), verbs);
}
protected void CheckAcceptVerbs<TControllerType>(string methodName, Type[] ActionMethodParameterTypes, HttpVerbs verbs)
{
CheckAcceptVerbs(methodName, typeof(TControllerType).GetMethod(methodName, BindingFlags.Public | BindingFlags.Instance, null, ActionMethodParameterTypes, null), verbs);
}
private void CheckAcceptVerbs<TControllerType>(string methodName, MethodInfo actionMethod, HttpVerbs verbs)
{
Assert.IsNotNull(actionMethod, "Could not find action method " + methodName);
var attribute =
(AcceptVerbsAttribute)
actionMethod.GetCustomAttributes(false).FirstOrDefault(
c => c.GetType() == typeof(AcceptVerbsAttribute));
if (attribute == null)
{
Assert.AreEqual(HttpVerbs.Get, verbs);
return;
}
Assert.IsTrue(HttpVerbsEnumToArray(verbs).IsEqualTo(attribute.Verbs));
}
Первый метод предназначен для методов действия без параметров, а второй - для параметров с параметрами. Вы также можете просто использовать третий метод напрямую, но я написал первые две перегрузки как вспомогательные функции.
Вы также можете использовать MvcContrib.TestHelper для проверки маршрута с действиями.
[TestMethod]
public void ShouldConfirmRouteForNewObjectWithPost()
{
"~/Object/New".WithMethod(HttpVerbs.Post).ShouldMapTo<ObjectController>(x => x.New());
}
Я не знаю, но это только потому, что это не приходило мне в голову, пока вы не упомянули об этом. Я буду с этого момента.
Что касается меня, я всегда проверяю правильный AcceptVerbsAttribute для каждого действия в моих контроллерах.