MissingMethodException выбрасывается при попытке макета HtmlHelper с Moq - PullRequest
3 голосов
/ 10 августа 2010

Пытаясь следовать статье о насмешках над htmlhelper с помощью Moq , я столкнулся со следующей проблемой.Исключение выдается при создании htmlhelper.Я только предполагаю, что замок Виндзор используется (увидев сообщение об ошибке).

Исключение:

Произошло исключение MissingMethodException

Конструктор типа 'Замок.Proxies.ViewContextProxy 'не найден.

Трассировка стека:

в System.RuntimeType.CreateInstanceImpl (BindingFlags bindingAttr, Binder Binder, Object [] args, CultureInfo culture, Object[] activAttributes)

Код:

    public static HtmlHelper CreateHtmlHelper(ViewDataDictionary vd)
    {
        Mock<ViewContext> mockViewContext = new Mock<ViewContext>(
                                                new ControllerContext(
                                                    new Mock<HttpContextBase>().Object,
                                                    new RouteData(),
                                                    new Mock<ControllerBase>().Object),
                                                new Mock<IView>().Object,
                                                vd,
                                                new TempDataDictionary());

        Mock<IViewDataContainer> mockViewDataContainer = new Mock<IViewDataContainer>();
        mockViewDataContainer.Setup(v => v.ViewData).Returns(vd);

        return new HtmlHelper(mockViewContext.Object, mockViewDataContainer.Object);
    }

Я использую ASP MVC 2, Moq 4.0 beta 3, VS2010, используя среду тестирования IDE.

Как мне решить проблему и вернуть экземпляр HtmlHelper?

Ответы [ 2 ]

6 голосов
/ 10 августа 2010

Вы получаете MissingMethodException, когда MOQ не может сопоставить параметры Mock<>() с параметрами в конструкторе проверяемого класса.

Глядя на ViewContext объясняет, почему.Существует только одна перегрузка конструктора, и это:

 public ViewContext(ControllerContext controllerContext, IView view, ViewDataDictionary viewData, TempDataDictionary tempData, TextWriter writer);

Эта настройка (включая отсутствующие TextWriter макет) должна работать:

   Mock<ViewContext> mockViewContext = new Mock<ViewContext>(
     new ControllerContext(
     new Mock<HttpContextBase>().Object,
     new RouteData(),
     new Mock<ControllerBase>().Object),
     new Mock<IView>().Object,
     vd,
     new TempDataDictionary()
     new Mock<TextWriter>().Object);

PS MOQиспользует Castle Dynamic Proxy для создания ложных классов во время выполнения, отсюда и название Castle в исключении, которое вы видите.Castle Windsor использует проект Dynamic Proxy, но это совершенно разные проекты.

1 голос
/ 11 августа 2010

Я воспроизвел вашу проблему с кодом из моего блога.Для меня работает следующий обновленный метод:

public static HtmlHelper CreateHtmlHelper(ViewDataDictionary vd)
{
    Mock<ViewContext> mockViewContext = new Mock<ViewContext>(
        new ControllerContext(
            new Mock<HttpContextBase>().Object,
            new RouteData(),
            new Mock<ControllerBase>().Object),
        new Mock<IView>().Object,
        vd,
        new TempDataDictionary(),
        new Mock<TextWriter>().Object);

    mockViewContext.Setup(vc => vc.ViewData).Returns(vd);

    var mockViewDataContainer = new Mock<IViewDataContainer>();
    mockViewDataContainer.Setup(v => v.ViewData)
        .Returns(vd);

    return new HtmlHelper(mockViewContext.Object,
                            mockViewDataContainer.Object);
}

Я также разместил обновление в своем блоге .

...