Asp.net mvc 3 Asp.Net Mvc HtmlHelper测试VeiwContext.Writer.WriteLine

Asp.net mvc 3 Asp.Net Mvc HtmlHelper测试VeiwContext.Writer.WriteLine,asp.net-mvc-3,razor,moq,html-helper,xunit.net,Asp.net Mvc 3,Razor,Moq,Html Helper,Xunit.net,我有一个HtmlHelper,用于输出一些手风琴风格的功能。这个助手将在整个站点中广泛使用 用于创建此功能的代码广泛使用了TagBuilder,当然,我们使用以下方式输出html: htmlHelper.ViewContext.Writer.WriteLine(someTag.ToString(TagRenderMode.StartTag)); 我们有几个助手使用这种模式,它工作得很好 到目前为止一切都很好-它正是我想要的。然而,测试这是一场噩梦。如何测试htmlHelper.ViewCont

我有一个HtmlHelper,用于输出一些手风琴风格的功能。这个助手将在整个站点中广泛使用

用于创建此功能的代码广泛使用了
TagBuilder
,当然,我们使用以下方式输出html:

htmlHelper.ViewContext.Writer.WriteLine(someTag.ToString(TagRenderMode.StartTag));
我们有几个助手使用这种模式,它工作得很好

到目前为止一切都很好-它正是我想要的。然而,测试这是一场噩梦。如何测试
htmlHelper.ViewContext.Writer.WriteLine

如果重要的话,我们将使用xUnit和Moq

var viewContext=new viewContext();
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; }
    }
}
var viewContextWriter=new Mock(); var text=string.Empty; viewContextWriter.Setup(m=>m.WriteLine(It.IsAny())) .Callback((字符串s)=>text+=s); viewContext.Writer=viewContextWriter.Object; var html=new-HtmlHelper(viewContext,new-FakeViewDataContainer()); 私有类FakeViewDataContainer:IViewDataContainer { 私有ViewDataDictionary _viewData=新ViewDataDictionary(); 公共视图数据字典视图数据 { 获取{return\u viewData;} 设置{u viewData=value;} } }

断言时,写入Writer.WriteLine的内容将位于text方法的
text
变量中

使用以下代码测试和验证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);
var sb=new StringBuilder();
var context=newviewcontext();
context.ViewData=新的ViewDataDictionary(_testModel);
context.Writer=新的StringWriter(sb);
var page=newviewpage();
var helper=新的HtmlHelper(上下文,页面);
//在这里做你的事情来锻炼你的助手
//下面的示例包含两个正在测试的帮助程序
//MyCustomBeginForm帮助程序和OtherCoolHelperMaked帮助程序
使用(helper.MyCustomBeginForm(“secretsaint”))
{
helper.ViewContext.Writer.WriteLine(helper.otherCoolHelperImake(“bigMacSauce”);
}
//结束示例
//获取所有帮助程序的结果
var result=sb.ToString();
//此处针对发出的HTML进行断言和字符串测试
Assert.IsNotNullOrEmpty(result);

我可以找到的一个示例在这里:但这似乎假设了HtmlHelper的一个标准扩展,它使用
公共静态MvcHtmlString…
方法返回类似
return MvcHtmlString.Create(tagBuilder.ToString(TagRenderMode.Normal))。您的html助手方法实际返回的是什么?我们使用的模式与MvcForm工具使用的模式相同。所以它返回一个Accordian:IDisposable类。我明白了。你能不能在你的测试中做一些和我发布的链接中的那个家伙相似的事情。在您的情况下,您的返回值是Accordion类的一个实例,您可以对其进行相应的检查和断言?否,因为Accordion只负责在using块的末尾挤出end标记。。。我需要看看WriteLine调用输出的是什么。我的错,我没有意识到。我假设这行代码是写在你返回的对象上的,这个对象是可以测试的。也许您可以插入一个自定义的ViewContext,您可以在方法执行后进行互操作,以验证写入它的内容?或者您需要重构代码以确保每个元素都是可测试的。对不起,我帮不了多少忙。