Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 尝试使用Moq模拟HtmlHelper时引发MissingMethodException_Asp.net Mvc_Unit Testing_Mocking_Moq - Fatal编程技术网

Asp.net mvc 尝试使用Moq模拟HtmlHelper时引发MissingMethodException

Asp.net mvc 尝试使用Moq模拟HtmlHelper时引发MissingMethodException,asp.net-mvc,unit-testing,mocking,moq,Asp.net Mvc,Unit Testing,Mocking,Moq,当我试图遵循以下步骤时,遇到了以下问题。在创建htmlhelper时引发异常。我只是猜测castle windsor正在被使用(通过看到错误消息) 例外情况: 发生MissingMethodException 找不到类型为“Castle.Proxies.ViewContextProxy”的构造函数 堆栈跟踪: 位于System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr、Binder Binder、Object[]args、Cu

当我试图遵循以下步骤时,遇到了以下问题。在创建htmlhelper时引发异常。我只是猜测castle windsor正在被使用(通过看到错误消息)

例外情况:

发生MissingMethodException

找不到类型为“Castle.Proxies.ViewContextProxy”的构造函数

堆栈跟踪:

位于System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr、Binder Binder、Object[]args、CultureInfo区域性、Object[]ActivationAttribute)

守则:

    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);
    }
publicstatichtmlhelper-CreateHtmlHelper(ViewDataDictionary-vd)
{
Mock mockViewContext=新建Mock(
新控制器上下文(
新建Mock().Object,
新路由数据(),
新建Mock().Object),
新建Mock().Object,
vd,
新的TempDataDictionary());
Mock mockViewDataContainer=new Mock();
mockViewDataContainer.Setup(v=>v.ViewData).Returns(vd);
返回新的HtmlHelper(mockViewContext.Object、mockViewDataContainer.Object);
}
我使用的是ASP MVC 2,Moq 4.0 beta 3,VS2010,使用的是IDE的测试框架


如何解决该问题并返回HtmlHelper的实例?

当MOQ无法将参数与被模拟类的构造函数上的参数匹配时,您会得到
MissingMethodException

查看
ViewContext
可以解释原因。只有一个构造函数重载,它是:

 public ViewContext(ControllerContext controllerContext, IView view, ViewDataDictionary viewData, TempDataDictionary tempData, TextWriter writer);
此设置(包括缺少的
TextWriter
mock)应能正常工作:

   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);
Mock mockViewContext=新建Mock(
新控制器上下文(
新建Mock().Object,
新路由数据(),
新建Mock().Object),
新建Mock().Object,
vd,
新的TempDataDictionary()
新建Mock().Object);

PSMOQ使用Castle动态代理在运行时创建模拟类,因此在您看到的异常中命名为Castle。Castle Windsor使用动态代理项目,但它们是完全不同的项目。

我已经从我的博客文章中用代码复制了您的问题。以下更新的方法适用于我:

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);
}
publicstatichtmlhelper-CreateHtmlHelper(ViewDataDictionary-vd)
{
Mock mockViewContext=新建Mock(
新控制器上下文(
新建Mock().Object,
新路由数据(),
新建Mock().Object),
新建Mock().Object,
vd,
新建TempDataDictionary(),
新建Mock().Object);
mockViewContext.Setup(vc=>vc.ViewData).Returns(vd);
var mockViewDataContainer=new Mock();
mockViewDataContainer.Setup(v=>v.ViewData)
.返回(vd);
返回新的HtmlHelper(mockViewContext.Object,
mockViewDataContainer.Object);
}

我也发布了一个。

我们的思路肯定是正确的——现在的错误是:MissingMethodException发生:找不到成员。StackTrace:at System.DefaultBinder.BindToMethod(BindingFlags bindingAttr、MethodBase[]match、Object[]和args、ParameterModifier[]修饰符、CultureInfo CultureInfo、String[]名称、Object和state)有什么想法吗?Havard S,这篇文章的原始作者很好地回答了我的问题,在他的博客上发布更新,并发布解决方案。你非常接近,我希望我也能给你“答案”。哦,当然,我忘了。反对。不用担心,我会更新答案,使其适合其他人。此答案与Igor Zevaka提供的答案之间的关键区别在于,模拟是使用Mock().Object创建的。我刚刚在MVC 4上尝试了此操作,我在
Html.ViewContext.ViewData
上遇到空引用异常,看起来很多MVC内部代码都在使用它。你有没有可能更新上面的代码?编辑:我想我已经弄明白了,我会编辑上面的代码。代码已经由@anon更新,并根据MVC4进行了验证。