Я работал над лучшим способом тестирования абстрактного класса с именем TabsActionFilter
. Я гарантировал, что классы, которые наследуются от TabsActionFilter
, будут иметь метод с именем GetCustomer
. На практике этот дизайн, кажется, работает хорошо.
Там, где у меня были некоторые проблемы, выясняется, как проверить метод OnActionExecuted
базового класса. Этот метод основан на реализации защищенного абстрактного метода GetCustomer
. Я пытался издеваться над классом, используя Rhino Mocks , но не могу посмеяться над возвращением поддельного клиента из GetCustomer
. Очевидно, что переключение метода на public сделает насмешку доступной, но protected кажется более подходящим уровнем доступности .
В настоящее время в моем тестовом классе я добавил конкретный закрытый класс, который наследуется от TabsActionFilter
и возвращает поддельный объект Customer.
- Является ли конкретный класс единственным вариантом?
- Есть ли простой механизм насмешек, который мне не хватает, который позволил бы Rhino Mocks обеспечить возврат
GetCustomer
?
Как примечание Андерсон Аймс обсуждает свое мнение по этому вопросу в ответе по поводу Moq , и я мог упустить что-то ключевое, но это здесь не применимо.
Класс, который необходимо проверить
public abstract class TabsActionFilter : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
Customer customer = GetCustomer(filterContext);
List<TabItem> tabItems = new List<TabItem>();
tabItems.Add(CreateTab(customer, "Summary", "Details", "Customer",
filterContext));
tabItems.Add(CreateTab(customer, "Computers", "Index", "Machine",
filterContext));
tabItems.Add(CreateTab(customer, "Accounts", "AccountList",
"Customer", filterContext));
tabItems.Add(CreateTab(customer, "Actions Required", "Details",
"Customer", filterContext));
filterContext.Controller.ViewData.PageTitleSet(customer.CustMailName);
filterContext.Controller.ViewData.TabItemListSet(tabItems);
}
protected abstract Customer GetCustomer(ActionExecutedContext filterContext);
}
Тестовый класс и приватный класс для "насмешек"
public class TabsActionFilterTest
{
[TestMethod]
public void CanCreateTabs()
{
// arrange
var filterContext = GetFilterContext(); //method omitted for brevity
TabsActionFilterTestClass tabsActionFilter =
new TabsActionFilterTestClass();
// act
tabsActionFilter.OnActionExecuted(filterContext);
// assert
Assert.IsTrue(filterContext.Controller.ViewData
.TabItemListGet().Count > 0);
}
private class TabsActionFilterTestClass : TabsActionFilter
{
protected override Customer GetCustomer(
ActionExecutedContext filterContext)
{
return new Customer
{
Id = "4242",
CustMailName = "Hal"
};
}
}
}