使用自定义HtmlHelper进行测试时,涉及TryValidateModel的测试失败

时间:2018-03-08 17:26:02

标签: c# moq modelmetadata modelmetadataprovider

我测试了一个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);
    }
}

0 个答案:

没有答案