2012-02-08 51 views
2

我有一個HtmlHelper用於輸出一些手風琴風格的功能。這位助手將在整個工地廣泛使用。Asp.Net Mvc HtmlHelper測試VeiwContext.Writer.WriteLine

用於創建此功能的代碼使用了大量TagBuilder,當然,我們輸出使用HTML:

htmlHelper.ViewContext.Writer.WriteLine(someTag.ToString(TagRenderMode.StartTag)); 

我們有使用這個模式的幾個幫手,它的工作太棒了。

到目前爲止,這一切都很好 - 它完全符合我的要求。然而 - 測試這被證明是一場噩夢。我該如何測試htmlHelper.ViewContext.Writer.WriteLine

我們使用的xUnit和起訂量,如果它的事項

+0

一個樣品,我能找到的是在這裏:http://blogs.teamb.com/craigstuntz/2010/09/10/38638/但似乎承擔標準擴展HtmlHelper使用'公共靜態MvcHtmlString ...',其中的方法返回類似'return MvcHtmlString.Create(tagBuilder.ToString(TagRenderMode.Normal));'。你實際返回的html helper方法是什麼? – Nope 2012-02-08 11:08:30

+0

我們使用的是MvcForm使用的相同模式。所以它返回一個Accordian:IDisposable類。 – iwayneo 2012-02-08 11:17:31

+0

我明白了。你能否在你的測試中做出與我發佈的鏈接中的人類似的東西?在你的情況下,你的返回值是Accordion類的一個實例,然後你可以相應地進行檢查和斷言? – Nope 2012-02-08 11:33:31

回答

1
var viewContext = new ViewContext(); 
var viewContextWriter = new Mock<TextWriter>(); 
var text = string.Empty; 
viewContextWriter.Setup(m => m.WriteLine(It.IsAny<string>())) 
    .Callback((string s) => text += s); 
viewContext.Writer = viewContextWriter.Object; 
var html = new HtmlHelper(viewContext, new FakeViewDataContainer()); 

private class FakeViewDataContainer : IViewDataContainer 
{ 
    private ViewDataDictionary _viewData = new ViewDataDictionary(); 
    public ViewDataDictionary ViewData 
    { 
     get { return _viewData; } 
     set { _viewData = value; } 
    } 
} 

當你斷言,無論是寫到Writer.WriteLine將在文本方法的text變量。

0

使用下面的代碼來測試和驗證html助手。

驗證是另一個例子。

嘗試以下操作:

var sb = new StringBuilder(); 
var context = new ViewContext(); 
context.ViewData = new ViewDataDictionary(_testModel); 
context.Writer = new StringWriter(sb); 
var page = new ViewPage<TestModel>(); 
var helper = new HtmlHelper<TestModel>(context, page); 

//Do your stuff here to exercise your helper 

//Following example contains two helpers that are being tested 
//A MyCustomBeginForm Helper and a OtherCoolHelperIMade Helper 
using(helper.MyCustomBeginForm("secretSauce")) 
{ 
    helper.ViewContext.Writer.WriteLine(helper.OtherCoolHelperIMade("bigMacSauce")); 
} 
//End Example 

//Get the results of all helpers 
var result = sb.ToString(); 

//Asserts and string tests here for emitted HTML 
Assert.IsNotNullOrEmpty(result);