使用以下代码(使用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);
...我收到以下编译错误:
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'
我做错了什么?为什么我无法从HttpContextBase
转换为HttpContextBase
?
我从一个ASP.NET MVC项目开始,添加了一个NUnit测试项目,ReSharper整理了缺少的System.Web参考。根据VS中的属性窗口,我引用的System.Web.dll是C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Web.dll
中的那个。
答案 0 :(得分:7)
我发现(感谢Reflector)HttpContextBase
实际上在System.Web.dll, Version 4.0.0.0
和System.Web.Abstractions, Version 3.5.0.0
中的。
所以,我通过在项目中添加对System.Web.Abstractions, Version 4.0.0.0
的引用来修复它。
但是,奇怪的是,System.Web.Abstractions, Version 4.0.0.0
不包含HttpContextBase
。
所以,我仍然不确定发生了什么,但至少现在正在编译。
答案 1 :(得分:1)
可能System.Web
使用System.Web.Abstractions
中HttpContextBase
内的内容。
因此,HttpContextBase
类可能与System.Web.Abstractions
有关。
答案 2 :(得分:0)
您似乎已经引用了System.Web.Mvc
程序集的不同版本。尝试删除项目中对此程序集的所有引用,并从GAC添加它。
答案 3 :(得分:0)
我想知道是否可以使用程序集重定向修复此问题,而不是在.NET 4.0项目中引用.NET 3.5程序集?