2

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

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

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

我们有一些使用这种模式的助手,并且效果很好。

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

如果重要,我们正在使用 xUnit 和 Moq

4

2 回答 2

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 方法的text变量中。

于 2012-02-27T06:34:26.700 回答
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);
于 2012-05-24T21:24:17.937 回答