【问题标题】:Unit Test a HtmlHelper in ASP.net MVC在 ASP.net MVC 中对 HtmlHelper 进行单元测试
【发布时间】:2016-11-15 18:12:12
【问题描述】:

我有一个HtmlHelper,它返回引导程序selected 类。我使用这个助手将活动状态应用于我的菜单项。

助手代码

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 在 Helper 代码的 Line 5 上是 null。

测试该代码的灵活、正确的方法是什么?

【问题讨论】:

    标签: c# asp.net-mvc unit-testing mocking rhino-mocks


    【解决方案1】:

    我注意到您正在使用 rhino-mocks,但使用 Typemock Isolater 可以(而且非常容易)通过伪造 HtmlHelper 的依赖关系来解决您的问题,如下例所示:

    [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);
    
    }
    

    【讨论】:

      猜你喜欢
      • 2010-09-21
      • 1970-01-01
      • 2010-10-22
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      • 1970-01-01
      • 1970-01-01
      • 2011-07-27
      相关资源
      最近更新 更多