Jef*_*eff 19 .net c# unit-testing server.mappath
首先,我知道这个问题非常危险: 如何在C#中进行单元测试中的MapPath
但我希望它有一个不同的解决方案.我的问题如下:
在我的代码中,我有一个需要验证的对象.我正在为每个验证方法创建单元测试,以确保它正确验证.我正在创建模拟数据并将其加载到对象中,然后验证它.问题是在验证过程中,当发生错误时,会分配错误代码.此错误代码用于使用Server.MapPath从xml文件收集有关错误的信息.但是,在尝试获取xml文件时,会抛出异常,这意味着无法找到该文件.
由于MapPath在我的验证代码中,而不是我的单元测试,如何让我的单元测试识别路径?这个问题有意义吗?
错误行(在我的验证码中不是我的单元测试):
XDocument xdoc = XDocument.Load(HttpContext.Current.Server.MapPath("App_Data/ErrorCodes.xml"));
Run Code Online (Sandbox Code Playgroud)
简化:单元测试在我的程序中调用一个调用Server.MapPath然后失败的方法.
Chr*_*sal 15
我会将"文件名提供程序"抽象为一个只返回一个位置的类,然后你可以更容易地模拟它.
public class PathProvider
{
public virtual string GetPath()
{
return HttpContext.Current.Server.MapPath("App_Data/ErrorCodes.xml");
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以直接使用PathProvider类...
PathProvider pathProvider = new PathProvider();
XDocument xdoc = XDocument.Load(pathProvider.GetPath());
Run Code Online (Sandbox Code Playgroud)
或者在测试中嘲笑它:
PathProvider pathProvider = new MockPathProvider(); // using a mocking framework
XDocument xdoc = XDocument.Load(pathProvider.GetPath());
Run Code Online (Sandbox Code Playgroud)
Jef*_*eff 11
经过严格的谷歌搜索和同事的一些帮助,我们想出了一个已经内置到.net中的简单解决方案
在访问验证过程的单元测试之上,我补充说:
[TestMethod()]
[HostType("ASP.NET")]
[UrlToTest("http://localhost:###/upload_file.aspx")]
[AspNetDevelopmentServerHost("Path To Web Application", "Path To Web Root")]
Run Code Online (Sandbox Code Playgroud)
这非常有效.基本上,在调用测试时,它会在页面加载中使用指定的单元测试加载URL.由于它是一个现在调用单元测试的网站,因此验证将可以访问Server.MapPath.这个解决方案可能并不适用于所有人,但它对此非常有用.感谢您所贡献的一切.
| 归档时间: |
|
| 查看次数: |
12173 次 |
| 最近记录: |