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.
I discovered (thanks Reflector) that
HttpContextBaseis actually inSystem.Web.dll, Version 4.0.0.0and inSystem.Web.Abstractions, Version 3.5.0.0.So, I fixed it by adding a reference to
System.Web.Abstractions, Version 4.0.0.0to the project.Oddly, however,
System.Web.Abstractions, Version 4.0.0.0doesn’t containHttpContextBase.So, I’m still not sure what’s going on, but at least it’s compiling now.