Тесты, включающие TryValidateModel, не выполняются при запуске с тестом с использованием пользовательского HtmlHelper

У меня есть тест метода расширения 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://stackru.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 ответов

Другие вопросы по тегам