2017-01-06 12 views
0

Существует обычай логика установить заголовок страницы в OnActionExecuting случае моего контроллера, который устанавливает значение по умолчанию для заголовка, если он не установлен с помощью атрибута методов действия:блока тестирование логика в контроллере событии OnActionExecuting

[PageTitle("Overriden page title")] 
public ActionResult About() 
{ 
    return View(); 
} 

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

protected override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    //Page title 
    var title = filterContext.ActionDescriptor.GetCustomAttributes(typeof(PageTitleAttribute), false); 
    if (title.Length == 1) 
     ViewBag.Title = ((PageTitleAttribute)(title[0])).Parameter; 
    else 
     ViewBag.Title = "Default Website Title"; 
} 

Как я могу проверить эту функциональность?

+0

Почему не реализации вышеизложенной логики OnActionExecuting внутри фильтра PageTitle действий и испытания Единицы действия фильтра сам? – Spock

+0

@Spock Я мог бы иметь, но проблема была тогда, когда ActionFilterAttribute работал бы только, если был украшен методом действия. Я хотел, чтобы значения по умолчанию были установлены/возвращены в случае, если действие не было применено к декоратору. – user869375

ответ

1

Это то, что я закончил делать (может быть полезно для тех, кто сталкивается с подобной проблемой).

1) Я дробить код в контроллере ниже:

public class BaseController : Controller 
{ 
    protected override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     SetupMetadata(filterContext); 
     base.OnActionExecuting(filterContext); 
    } 

    public virtual void SetupMetadata(ActionExecutingContext filterContext) 
    { 
     //Page title 
     var title = filterContext.ActionDescriptor.GetCustomAttributes(typeof(PageTitleAttribute), false); 
     if (title.Length == 1) 
      ViewBag.Title = ((PageTitleAttribute)(title[0])).Parameter; 
     else 
      ViewBag.Title = "Default Page Title"; 
    } 
} 

2) Выведение мой HomeController из basecontroller.

3) А затем блок протестировал его с помощью:

[TestClass] 
public class BaseControllerTests 
{ 
    [TestMethod] 
    public void OnActionExecuting_should_return_attribute_value_when_set() 
    { 
     var ctx = new Mock<ActionExecutingContext>(); 
     var controller = new HomeController(); 

     ctx.Setup(c => c.Controller).Returns(controller); 
     ctx.Setup(c => c.ActionDescriptor.GetCustomAttributes(typeof(PageTitleAttribute), false)).Returns(new object[] { new PageTitleAttribute("Overriden Title") }); 

     controller.SetupMetadata(ctx.Object); 

     Assert.AreEqual("Overriden Title", controller.ViewBag.Title); 
    } 

    [TestMethod] 
    public void OnActionExecuting_should_return_default_attribute_values_if_attributes_are_missing() 
    { 
     var ctx = new Mock<ActionExecutingContext>(); 
     var controller = new HomeController(); 

     ctx.Setup(c => c.Controller).Returns(controller); 
     ctx.Setup(c => c.ActionDescriptor.GetCustomAttributes(typeof(PageTitleAttribute), false)).Returns(new object[0]); 

     controller.SetupMetadata(ctx.Object); 

     Assert.AreEqual("Default Page Title", controller.ViewBag.Title); 
    } 
}