2016-07-13 12 views
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); 
} 

これは私にエラーを与えています。私がデバッグすると、ControllerContextnullであり、のヘルパーコードのLine 5であることがわかります。

このコードを柔軟かつ正確にテストするにはどうすればよいでしょうか?

答えて

1

私は、次の例に示すようHtmlHelperの依存関係を偽造することによってTypemock Isolaterを使用して、あなたの問題を解決するために、あなたはサイ・モックを使用しているが、それは可能(と本当に簡単)ことに気付きました:

[TestMethod, Isolated] 
public void WhenPassedControllerAndActionMatchContextReturnSelectedClass() 
{ 
    var fakeHtmlHalper = Isolate.Fake.Dependencies<HtmlHelper>(); 
    var fakeViewContext = Isolate.GetFake<ViewContext>(fakeHtmlHalper); 

    Isolate.WhenCalled(() => fakeViewContext.RouteData.Values["controller"]).WillReturn("performance"); 
    Isolate.WhenCalled(() => fakeViewContext.RouteData.Values["action"]).WillReturn("search"); 

    var result = fakeHtmlHalper.IsSelected("performance", "search"); 

    Assert.AreEqual("selected", result); 

} 
関連する問題