App*_*ere 6 model-view-controller unit-testing moq mocking
我正在对使用VirtualParthUtility.GetAbsolute的代码运行单元测试,但是在模拟上下文时遇到了问题.
我已经用Moq设置了一个模拟上下文,如下所示
private Mock<HttpContextBase> MakeMockHttpContext(string url) // url = "~/"
{
var mockHttpContext = new Mock<HttpContextBase>();
// Mock the request
var mockRequest = new Mock<HttpRequestBase>();
mockRequest.Setup(x => x.ApplicationPath).Returns("/");
mockRequest.Setup(x => x.Path).Returns("/");
mockRequest.Setup(x => x.PathInfo).Returns(string.Empty);
mockRequest.Setup(x => x.AppRelativeCurrentExecutionFilePath).Returns(url);
mockHttpContext.Setup(x => x.Request).Returns(mockRequest.Object);
// Mock the response
var mockResponse = new Mock<HttpResponseBase>();
mockResponse.Setup(x => x.ApplyAppPathModifier(It.IsAny<string>())).Returns((string s) => s);
mockHttpContext.Setup(x => x.Response).Returns(mockResponse.Object);
return mockHttpContext;
}
Run Code Online (Sandbox Code Playgroud)
并将其附加到MVC控制器
_myController.ControllerContext = new ControllerContext(MakeMockHttpContext("~/").Object, new RouteData(), _slideSelectorController);
Run Code Online (Sandbox Code Playgroud)
测试期间运行的代码命中行:
venue.StyleSheetUrl = VirtualPathUtility.ToAbsolute(venue.StyleSheetUrl); // input like "~/styles/screen.css"
Run Code Online (Sandbox Code Playgroud)
每次运行时,它都会进入System.Web.VirtualPathUtility,问题是返回的"VirtualParthString"总是抛出异常:
public static string ToAbsolute(string virtualPath)
{
return VirtualPath.CreateNonRelative(virtualPath).VirtualPathString;
}
Run Code Online (Sandbox Code Playgroud)
在System.Web.VirtualPathString中很容易看到异常的原因:
public string VirtualPathString
{
get
{
if (this._virtualPath == null)
{
if (HttpRuntime.AppDomainAppVirtualPathObject == null)
{
throw new HttpException(System.Web.SR.GetString("VirtualPath_CantMakeAppAbsolute", new object[] { this._appRelativeVirtualPath }));
}
if (this._appRelativeVirtualPath.Length == 1)
{
this._virtualPath = HttpRuntime.AppDomainAppVirtualPath;
}
else
{
this._virtualPath = HttpRuntime.AppDomainAppVirtualPathString + this._appRelativeVirtualPath.Substring(2);
}
}
return this._virtualPath;
}
}
Run Code Online (Sandbox Code Playgroud)
通过Watch Window,我可以看到_virtualPath和HttpRuntime.AppDomainAppVirtualPathString都是null,因此它会抛出异常.
如果设置了_virtualPath,则不会发生异常.但是,在VirtualPath.Create方法创建了新的VirtualPath对象之后,它不会在返回之前设置_virtualPath属性.到目前为止,Create方法的摘录是:
VirtualPath path = new VirtualPath();
if (UrlPath.IsAppRelativePath(virtualPath))
{
virtualPath = UrlPath.ReduceVirtualPath(virtualPath);
if (virtualPath[0] == '~')
{
if ((options & VirtualPathOptions.AllowAppRelativePath) == 0)
{
throw new ArgumentException(System.Web.SR.GetString("VirtualPath_AllowAppRelativePath", new object[] { virtualPath }));
}
path._appRelativeVirtualPath = virtualPath;
return path;
Run Code Online (Sandbox Code Playgroud)
因此,如果有人可以建议如何让这个单元测试工作,这将是非常有帮助的!
谢谢,
史蒂夫
我只想创建一个包装器接口.就像是:
public interface IPathUtilities
{
string ToAbsolute(string virtualPath);
}
Run Code Online (Sandbox Code Playgroud)
您可以将其注入控制器.在测试时,使用存根.在运行时,您将拥有一个实现IPathUtilities和调用的类VirtualPathUtility.ToAbsolute().
| 归档时间: |
|
| 查看次数: |
2559 次 |
| 最近记录: |