2014-11-23 5 views
3

У меня есть довольно распространенный сценарий на моих руках, что включает в себя два метода действия одного и того же имени - один для обработки запросов POST, а другой для обработки запросов GET:Должен ли я тестировать атрибуты в проекте ASP MVC?

public ActionResult Add() 
{ 
    return View(); 
} 

[HttpPost] 
public ActionResult Add(Question question) 
{ 
    repository.Add(question); 
    return RedirectToAction("Index"); 
} 

Как вы можете видеть, методы действия дифференцируются с помощью атрибута. Если я удалю атрибут HttpPost, время выполнения столкнется с желтым экраном смерти.

Мой вопрос: разумно ли написать единичный тест, который использует отражение, чтобы убедиться, что этот конкретный метод украшен атрибутом HttpPost? У меня есть склонность делать это, потому что если кто-то случайно удалит атрибут, произойдет сбой сервера.

+2

Вы не повредите ничего путем добавления модульного теста, но если вы думаете, что кто-то может удалить атрибут «HttpPost», вам, вероятно, следует поговорить с ними. – Jonesopolis

+0

@ Jonesy Ну, я программирую соло, но ваш комментарий резонирует со мной. –

+0

Если вы добавите тест на все возможные вещи, которые могут пойти не так, вы будете тратить много времени на написание тестов ... Если вы в порядке с этим, то непременно ... Однако вам обычно приходится решить, где наилучшее значение теста для вас. –

ответ

1

Ваш метод отправки уже имеет другую подпись на C#, поэтому вы, по крайней мере, проверяете его. Я думаю, что это по усмотрению тестера, но не обязательно. GET и POST запросы являются неотъемлемой частью Интернета.

Если вы решите это сделать, вы можете сделать что-то вроде

var postMethod = typeof(NameOfController).GetMethods().FirstOrDefault(p => p.GetCustomAttribute<HttpPost>(false) != null && p.Name == "Add"); 
Assert.IsTrue(postMethod != null); 

Это не может скомпилировать дословно, но это суть его. Обязательно добавьте System.Reflection для использования методов расширения.