Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 如何测试调用Partial的HTMLHelper?_Asp.net Mvc 3_Mocking_Rhino Mocks_Html Helper - Fatal编程技术网

Asp.net mvc 3 如何测试调用Partial的HTMLHelper?

Asp.net mvc 3 如何测试调用Partial的HTMLHelper?,asp.net-mvc-3,mocking,rhino-mocks,html-helper,Asp.net Mvc 3,Mocking,Rhino Mocks,Html Helper,我一直在研究Stackoverflow问题,并已实现了答案。在我调用助手方法中的HtmlHelper.Partial之前,它工作得非常好,如下所示。我知道这可能不是最好的代码,但这是直到我可以重构更多的应用程序。它抛出的错误是 上一个方法“ViewContext.get_TempData();”需要返回值或异常才能引发 我是否错过了模拟,或者是否有更好的方法来呈现usercontrol 编辑好的,我确实错过了一些东西,我没有调用mocks.Replay()。现在有另一个错误,它希望routeDa

我一直在研究Stackoverflow问题,并已实现了答案。在我调用助手方法中的HtmlHelper.Partial之前,它工作得非常好,如下所示。我知道这可能不是最好的代码,但这是直到我可以重构更多的应用程序。它抛出的错误是

上一个方法“ViewContext.get_TempData();”需要返回值或异常才能引发

我是否错过了模拟,或者是否有更好的方法来呈现usercontrol

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

编辑#2澄清我试图模拟对HtmlHelper.Partial(partialPath,model)的调用,我只希望它返回我发送的任何partialPath,或者至少不放大。我确实发现这一页很有帮助,我几乎把事情做好了。这也很有帮助


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


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

我认为“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源代码,看看分部方法中调用了什么,可能会节省一些时间。你可以在这里买到

编辑


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

建议重构:您可以通过使用继承来简化场景。如果您有一个RatesViewDataBaseModel,以及两个子类RatesViewDataAPModel和RatesViewDataARModel,那么您可以基于“is”操作符执行测试,而不是目前使用的更复杂的两阶段测试。这是未来的想法,但视图模型太大,控制器太大,我还不确定改变它会有什么影响。你还提到了mock的问题,你到底想测试什么?如果我们看到你的单元测试可能会有所帮助。我编辑了这篇文章,希望能澄清这一点。我想我是在测试如果一个现有的速率为空,页面是否会爆炸。不,我想我不知道这些是什么,我对ASP.NET MVC和这个应用程序都是新手。你能给出一个例子的链接吗?我想这就是我想做的,但是模型还没有准备好。我不想做这样的改变,因为我不知道会发生什么。这里有关于deisplay和编辑器模板的很好的讨论:是的,我认为这将是两者的结合。第一个链接起作用了……但只有在从模拟视图调用分部时,而不是从HtmlHelper调用分部时。有时间我会继续玩。很遗憾,测试东西太难了,当然这是在一个棕地应用程序上事后进行的大量测试。我不知道我在做什么。
Previous method 'ViewContext.get_TempData();' requires a return value or an exception to throw.