我一直在研究测试名为的抽象类的最佳方法TabsActionFilter
。我保证继承自的类TabsActionFilter
将有一个名为GetCustomer
。在实践中,这种设计似乎效果很好。
我遇到的一些问题是弄清楚如何测试OnActionExecuted
基类的方法。该方法依赖于受保护的摘要 GetCustomer
方法。我尝试过使用嘲笑班级犀牛模拟 http://www.ayende.com/projects/rhino-mocks.aspx但似乎无法嘲笑假顾客的回归GetCustomer
。显然,将方法翻转为public将使嘲笑可用,但是受保护的感觉更合适可访问性级别 http://msdn.microsoft.com/en-us/library/ba0a1yw2(v=VS.71).aspx.
目前,在我的测试类中,我添加了一个继承自的具体私有类TabsActionFilter
并返回一个伪造的 Customer 对象。
- 具体类是唯一的选择吗?
- 是否有一个我缺少的简单的模拟机制可以让 Rhino Mocks 提供回报
GetCustomer
?
作为注释安德森·艾姆斯 https://stackoverflow.com/users/3244/anderson-imes并在其中讨论了他对此的看法回答关于起订量 https://stackoverflow.com/questions/1980108/moq-verifying-a-method-was-called/2000357#2000357我可能会遗漏一些关键的东西,但它似乎并不适用于此。
需要测试的类
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);
}
“mocking”的测试类和私人类
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"
};
}
}
}