gpt4 book ai didi

unit-testing - 如何在使用 VirtualPathUtility.GetAbsolute 方法对代码进行单元测试时模拟上下文

转载 作者:行者123 更新时间:2023-12-03 11:12:46 28 4
gpt4 key购买 nike

我正在对使用 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;
}

并将其附加到 MVC Controller
_myController.ControllerContext = new ControllerContext(MakeMockHttpContext("~/").Object, new RouteData(), _slideSelectorController);

测试期间运行的代码符合以下要求:
venue.StyleSheetUrl = VirtualPathUtility.ToAbsolute(venue.StyleSheetUrl); // input like "~/styles/screen.css"

每次运行时,它都会进入 System.Web.VirtualPathUtility,问题是要返回的“VirtualParthString”总是抛出异常:
 public static string ToAbsolute(string virtualPath)
{
return VirtualPath.CreateNonRelative(virtualPath).VirtualPathString;
}

异常的原因在 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;
}
}

通过监 window 口,我可以看到 _virtualPath 和 HttpRuntime.AppDomainAppVirtualPathString 都是空的,因此它会引发异常。

如果设置了 _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;

因此,如果有人可以建议如何让这个单元测试工作,那将非常有帮助!

谢谢,

史蒂夫

最佳答案

我只想创建一个包装器接口(interface)。就像是:

public interface IPathUtilities
{
string ToAbsolute(string virtualPath);
}

您可以将其注入(inject)您的 Controller 。在测试时,使用 stub 。在运行时,您将拥有一个实现 IPathUtilities 的类。并调用 VirtualPathUtility.ToAbsolute() .

关于unit-testing - 如何在使用 VirtualPathUtility.GetAbsolute 方法对代码进行单元测试时模拟上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7538920/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com