我有一个 HtmlHelper 扩展方法的测试,当它是我运行的唯一测试时效果很好。它出现在下面。只要我不同时运行此测试,我的所有其他单元测试都会在我运行它们时成功。
但是当我一起运行这个和我所有的其他单元测试时,所有那些测试调用 System.Web.Mvc.Controller 的过程的那些。TryValidateModel在该行上失败(无论模型如何),但有以下例外:
System.InvalidCastException:无法将“Castle.Proxies.INicheUserProxy”类型的对象转换为“System.Web.Mvc.ModelMetadataProvider”类型。
所有不调用 TryValidateModel 的测试都成功——除了下面的测试,它在过程的 ModelMetadata.FromLambdaExpression 行上失败并出现相同的异常(见下文)。
我认识到 ModelMetaData ...
“为通用元数据、ModelMetadataProvider 类和数据模型的 ModelValidator 类提供容器。” https://msdn.microsoft.com/en-us/library/system.web.mvc.modelmetadata(v=vs.118).aspx
...并且正在测试的程序是这样开始的...
public static class HtmlHelperExtension
{
public static MvcHtmlString DisplayForTruncated<TModel, TValue>(this HtmlHelper<TModel> html,
Expression<Func<TModel, TValue>> expression)
{
var metaData = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
var rawInputText = metaData.SimpleDisplayText;
// ....
}
}
...所以我担心在这个测试中弄乱 HtmlHelper 会影响(破坏?)其他所有测试的 ModelMetaData。
我在做什么导致这些测试在同一测试运行中失败(但在它们不是成功时)?我该如何纠正?
[TestFixture]
public class HtmlHelperExtensionTests
{
[Test]
public void DisplayForTruncated_happy_path()
{
const string summary = "AAA BBB CCC";
var htmlHelper = DisplayForTruncated_BuildHtmlHelper(summary);
var output = htmlHelper.DisplayForTruncated(m => m.FirstOrDefault().RearrangedSummary, NoLimit);
Assert.IsNotNull(output);
Assert.AreEqual(Utility.RearrangePersonSummary(summary), output.ToString());
}
private static HtmlHelper<Webdiyer.WebControls.Mvc.PagedList<PersonSummaryViewModel>>
DisplayForTruncated_BuildHtmlHelper(string summary)
{
// from https://stackoverflow.com/questions/20498036/unit-testing-generic-htmlhelper-methods-with-nunit
var viewModel = new PersonSummaryViewModel {Summary = summary};
var listViewModel = new List<PersonSummaryViewModel> {viewModel};
var inputPagedListModel = new Webdiyer.WebControls.Mvc.PagedList<PersonSummaryViewModel>
(listViewModel, listViewModel.Count, 100);
var viewData = new ViewDataDictionary(inputPagedListModel);
var viewContext = new Mock<ViewContext>();
viewContext.Setup(x => x.ViewData).Returns(viewData);
var mockViewDataContainer = new Mock<IViewDataContainer>();
mockViewDataContainer.Setup(v => v.ViewData).Returns(viewData);
return new HtmlHelper<Webdiyer.WebControls.Mvc.PagedList<PersonSummaryViewModel>>
(viewContext.Object, mockViewDataContainer.Object);
}
}