With the following code (using Moq 4.0.10501.6):
HomeController controller = new HomeController();
ActionResult result = _controller.Index();
Mock<HttpResponseBase> response = new Mock<HttpResponseBase>();
Mock<HttpContextBase> httpContext = new Mock<HttpContextBase>();
httpContext.Setup(x => x.Response).Returns(response.Object);
Mock<ControllerContext> controllerContext = new Mock<ControllerContext>();
controllerContext.Setup(c => c.HttpContext).Returns(httpContext.Object);
result.ExecuteResult(controllerContext.Object);
...I get the following compiler errors:
error CS1502: The best overloaded method match for
'Moq.Language.IRet开发者_开发百科urns<System.Web.Mvc.ControllerContext,
System.Web.HttpContextBase>.Returns(System.Web.HttpContextBase)'
has some invalid arguments
error CS1503: Argument 1: cannot convert from 'System.Web.HttpContextBase
[c:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\
v4.0\System.Web.dll]' to 'System.Web.HttpContextBase'
What have I done wrong? Why can't I convert from HttpContextBase
to HttpContextBase
?
I started with an ASP.NET MVC project, added an NUnit test project and ReSharper sorted out the missing System.Web reference. According to the properties window in VS, the System.Web.dll that I'm referencing is the one in C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Web.dll
.
I discovered (thanks Reflector) that HttpContextBase
is actually in System.Web.dll, Version 4.0.0.0
and in System.Web.Abstractions, Version 3.5.0.0
.
So, I fixed it by adding a reference to System.Web.Abstractions, Version 4.0.0.0
to the project.
Oddly, however, System.Web.Abstractions, Version 4.0.0.0
doesn't contain HttpContextBase
.
So, I'm still not sure what's going on, but at least it's compiling now.
May be System.Web
uses something in System.Web.Abstractions
within HttpContextBase
.
So, probably HttpContextBase
Class has something tied to System.Web.Abstractions
.
It seems that you have referenced different versions of the System.Web.Mvc
assembly. Try removing all references to this assembly in your projects and adding it from the GAC.
I wonder if this could be fixed with an assembly redirect instead of referencing a .NET 3.5 assembly in a .NET 4.0 project?
精彩评论