2011-09-28 63 views
0

我一直在看this Stackoverflow的問題,並已答案實施。它工作得很好,直到我用下面列出的幫助方法調用HtmlHelper.Partial。我知道這可能不是最好的代碼,但是直到我可以重構更多的應用程序。它拋出的錯誤是如何測試調用部分的HtmlHelpers?

上一個方法'ViewContext.get_TempData();'需要返回值或拋出異常。

我缺少嘲弄的東西,還是有更好的方式來呈現usercontrol?

編輯好吧我確實錯過了一些東西,我沒有打電話給mocks.Replay()。現在有另一個錯誤,它要在routeData ... progress中命名爲controller。

編輯#2澄清我試圖嘲弄調用HtmlHelper.Partial(partialPath,型號),我只是想,要返回任何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; 
    } 
+1

建議重構:您可能可以通過使用繼承來簡化您的場景。如果您有一個RatesViewDataBaseModel和兩個子類,RatesViewDataAPModel和RatesViewDataARModel,您可以基於'is'運算符執行測試,而不是目前更復雜的兩階段測試。 –

+0

這是前進的想法,但視圖模型如此之大,控制器如此之大,我不確定它在改變它的意義。 – nportelli

+0

你也提到過mock有問題,你究竟想在這裏測試什麼?如果我們看到你的單元測試可能會有所幫助。 –

回答

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源代碼,以查看在部分方法中調用的內容。你可以在這裏獲得http://aspnet.codeplex.com/releases/view/58781

編輯

BTW。 TempData屬性返回一個System.Web.Mvc.TempDataDictionary。嘲諷財產返回其中一個空的實例應解決眼前的問題。

+0

是的,我認爲它將會是兩者的結合。第一個鏈接工作...但只有當部分從你的模擬視圖調用,而不是從HtmlHelper調用。我有空的時候會繼續玩。這是一個恥辱,它是很難測試的東西,當然這是一個棕色的應用程序事實後的很多測試。我不知道我在做什麼。 – nportelli

0

你有沒有考慮使用顯示和編輯模板,爲您的用戶控件而不是擴展的HtmlHelper?

我曾經在早期的MVC版本中做過很多相同的事情,但我幾乎完全轉向使用模板。

+0

不,我想我不知道這些是什麼,我是ASP.NET MVC和這個應用程序的新手。你能給一個例子的鏈接嗎?我認爲這就是我想要做的,但該模型尚未設置。我不想做出這樣的改變,不知道會發生什麼事情。 – nportelli

+1

關於deisplay和編輯器模板在這裏有很好的討論:http://stackoverflow.com/questions/5037580/asp-net-mvc-3-partial-vs-display-template-vs-editor-template –