如何测试调用Partial的HtmlHelpers?

时间:2011-09-28 20:27:52

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

我一直在关注this Stackoverflow问题,并且已经实现了答案。它工作得很好和花花公子,直到我在我的帮助方法中调用HtmlHelper.Partial,如下所示。我知道它可能不是最好的代码,但这是我可以重构更多的应用程序。它抛出的错误是

  

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

我是否缺少嘲笑某些内容,或者是否有更好的方法来呈现用户控件?

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

编辑#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;
    }

2 个答案:

答案 0 :(得分:1)

我认为'farm fresh code'给出的示例是正确的方法,你不能直接模拟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。模拟属性以返回其中一个的空实例应解决当前的问题。

答案 1 :(得分:0)

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

我曾经在早期的MVC版本中做过相同的事情,但我现在几乎完全转向使用模板了。