views:

60

answers:

2

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.IReturns<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.

A: 

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.

Darin Dimitrov
HttpContextBase is in System.Web.dll, not System.Web.Mvc.dll, so why should that matter? Also, the versions of both System.Web.dll and System.Web.Mvc.dll are the same in both projects.
Roger Lipscombe
Ah. I see where you're going with this: HttpContextBase is in `System.Web 4.0.0.0`, *and* in `System.Web.Abstractions 3.5.0.0`. ControllerContext is in `System.Web.Mvc 2.0.0.0`
Roger Lipscombe
A: 

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.

Roger Lipscombe