【问题标题】:How to test HtmlHelpers that call Partial?如何测试调用 Partial 的 HtmlHelper?
【发布时间】:2011-09-28 20:27:51
【问题描述】:

我一直在查看this Stackoverflow 问题并已实施答案。在我在我的帮助方法中调用 HtmlHelper.Partial 之前,它工作得很好而且很花哨,下面列出了。我知道它可能不是最好的代码,但这是在我可以重构更多应用程序之前。它抛出的错误是

上一个方法'ViewContext.get_TempData();'需要返回值或抛出异常。

我错过了模拟某些东西,还是有更好的方法来呈现用户控件?

编辑好吧,我确实错过了一些东西,我没有调用 mocks.Replay()。现在有另一个错误,它需要在 routeData...progress 中命名为控制器的东西。

编辑 #2 澄清我正在尝试模拟对 HtmlHelper.Partial(partialPath, model) 的调用,我只是希望它返回我想发送的任何 partialPath,或者至少不返回爆炸。我确实找到了这个页面http://andrevianna.com/blog/?p=8,这非常有帮助,而且我几乎可以正常工作了。这也很有帮助http://farm-fresh-code.blogspot.com/2009/10/mocking-htmlhelper-class-with.html

 public static string RenderRateDetails(this HtmlHelper html, string partialPath, RatesViewData model, RateDetailType type)
    {

        switch (type)
        {
            case RateDetailType.AR:
                if (model.ExistingRateDetailAR != null)
                    return html.Partial(partialPath, model).ToString();
                break;
            case RateDetailType.AP:
                if (model.ExistingRateDetail != null)
                    return html.Partial(partialPath, model).ToString();
                break;

        }

        return string.Empty;
    }

【问题讨论】:

  • 建议重构:您可以通过使用继承来稍微简化您的场景。如果您有一个 RatesViewDataBaseModel 和几个子类 RatesViewDataAPModel 和 RatesViewDataARModel,那么您可以执行基于“is”运算符的测试,而不是目前更复杂的两阶段测试。
  • 这是未来的想法,但是视图模型太大了,控制器也太大了,我还不确定更改它的含义。
  • 您还提到了模拟问题,您实际上想在这里测试什么?如果我们看到您的单元测试可能会有所帮助。
  • 我编辑了帖子以希望澄清。我想我正在尝试测试如果 ExistingRates 之一为空,页面是否不会爆炸。

标签: asp.net-mvc-3 mocking rhino-mocks html-helper


【解决方案1】:

我认为“农场新鲜代码”中给出的示例是正确的方法,您不能直接模拟 HtmlHelper,但您可以构建一个模拟所有依赖项的实例。

当您调用 html.Partial(partialPath, model).ToString() 的代码时,HtmlHelper 会调用您模拟的依赖项的属性和方法,如果这些不返回合理的默认值,您会收到错误。

在这种情况下,它看起来像调用了模拟 ViewContext 对象的 TemplateData 属性,我想它返回了 null,因此:

Previous method 'ViewContext.get_TempData();' requires a return value or an exception to throw.

一旦你模拟了这个属性,你应该能够克服这个错误,但你可能需要模拟更多的东西才能让它全部工作。

查看 MVC 源代码以了解 Partial 方法中调用了什么可能会节省您一些时间。你可以在这里http://aspnet.codeplex.com/releases/view/58781获得。

编辑

顺便说一句。 TempData 属性返回 System.Web.Mvc.TempDataDictionary。模拟属性以返回其中一个的空实例应该可以解决直接问题。

【讨论】:

  • 是的,我认为这将是两者的结合。第一个链接有效...但仅当从您的模拟视图调用局部时,而不是从 HtmlHelper 调用它。有时间我会继续玩。很遗憾,测试东西如此困难,当然这是在棕地应用程序上进行的大量测试。而且我不知道自己在做什么。
【解决方案2】:

您是否考虑过为您的用户控件使用显示和编辑器模板而不是扩展 HtmlHelper?

我在早期的 MVC 版本中经常做同样的事情,但现在我几乎完全改用模板了。

【讨论】:

  • 不,我想我不知道那些是什么,我对 ASP.NET MVC 和这个应用程序都是新手。你能给出一个例子的链接吗?我认为这就是我想要做的,但模型还没有设置好。而且我不想做出这样的改变,不知道会发生什么。
  • 这里有关于显示和编辑器模板的很好的讨论:stackoverflow.com/questions/5037580/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-30
  • 2010-09-21
  • 1970-01-01
  • 2011-05-15
  • 2011-03-26
  • 2011-01-29
  • 2012-09-04
相关资源
最近更新 更多