我在我的方法中使用HttpContext.Current.Server.MapPath()
来获取文档。
为此方法编写单元测试,
我该怎么做:
我如何模拟这个?
我只对Current.Server.Mappath()
而不是Path.Combine()
答案 0 :(得分:9)
可能最好的解决方案是避免使用Server.MapPath
:例如,您可以替换:
Server.MapPath("~/MyFolder/MyFile.dat")
由:
Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"MyFolder\MyFile.dat")
答案 1 :(得分:4)
典型的代码调用静态方法,在保持关注点分离和避免紧密耦合的同时进行测试非常困难。以下是测试和模拟“不可测试代码”的通用方法:为其编写“外观包装”。
为这些方法创建一个包装器。一个简单的类,包含名为sensibly的方法,并且只委托给untestable调用(通常是静态调用)
创建该包装类的接口
不要直接调用客户端代码中的untestable方法,而是使用包装器(使用步骤2中提供的接口进行依赖注入)并在其上调用常规方法。
在您的单元测试中,使用您想要的行为模拟包装器。
这种方法有效地减少了耦合并分离了需要分离的问题。当然,你仍然无法测试包装器本身的行为,但如果它足够简单(只委托给原始调用)那么它就不是一个大问题了。
答案 2 :(得分:0)
这是我的建议:
在你的应用中:
{...
var destinationPath= IOHelper.MapPath(DatafeedFolderName);
...
}
这是帮助方法的代码
public static string MapPath(string subFolder)
{
return HttpContext.Current.IsNull()
? Path.Combine(Directory.GetCurrentDirectory(), subFolder)
: HttpContext.Current.Server.MapPath(subFolder);
}
单元测试可以使用:
{...
Assert.True(runtime_path, Directory.GetCurrentDirectory() + "\destimationPath"
...}