1
HtmlHelper
には、ブートストラップselected
クラスが返されています。このヘルパーを使用して、メニュー項目にアクティブな状態を適用します。ユニットでASP.net MVCのHtmlHelperをテストする
ヘルパーコード
public static string IsSelected(this HtmlHelper html, string controllers = "", string actions = "",
string ccsClass = "selected")
{
var viewContext = html.ViewContext;
var isChildAction = viewContext.Controller.ControllerContext.IsChildAction;
if (isChildAction)
{
viewContext = html.ViewContext.ParentActionViewContext;
}
var routeValues = viewContext.RouteData.Values;
var currentController = routeValues["controller"].ToString();
var currentAction = routeValues["action"].ToString();
if (string.IsNullOrEmpty(controllers))
{
controllers = currentController;
}
if (string.IsNullOrEmpty(actions))
{
actions = currentAction;
}
var acceptedActions = actions.Trim().Split(',').Distinct().ToArray();
var acceptedControllers = controllers.Trim().Split(',').Distinct().ToArray();
return acceptedControllers.Contains(currentController) && acceptedActions.Contains(currentAction)
? ccsClass
: string.Empty;
}
テストコード
[Test]
public void WhenPassedControllerAndActionMatchContextReturnSelectedClass()
{
var htmlHelper = CreateHtmlHelper(new ViewDataDictionary());
var result = htmlHelper.IsSelected("performance", "search");
Assert.AreEqual("selected", result);
}
public static HtmlHelper CreateHtmlHelper(ViewDataDictionary viewData)
{
var mocks = new MockRepository();
var controllerContext = mocks.DynamicMock<ControllerContext>(
mocks.DynamicMock<HttpContextBase>(),
new RouteData(),
mocks.DynamicMock<ControllerBase>());
var viewContext = new ViewContext(controllerContext, mocks.StrictMock<IView>(), viewData, new TempDataDictionary(), mocks.StrictMock<TextWriter>());
//var mockViewContext = MockRepository.GenerateMock<ViewContext>();
var mockViewDataContainer = mocks.DynamicMock<IViewDataContainer>();
mockViewDataContainer.Expect(v => v.ViewData).Return(viewData);
return new HtmlHelper(viewContext, mockViewDataContainer);
}
これは私にエラーを与えています。私がデバッグすると、ControllerContext
がnull
であり、のヘルパーコードのLine 5であることがわかります。
このコードを柔軟かつ正確にテストするにはどうすればよいでしょうか?