如何对HttpContext.Current.Server.MapPath进行单元测试

时间:2013-10-22 07:04:55

标签: asp.net unit-testing

我在我的方法中使用HttpContext.Current.Server.MapPath()来获取文档。

为此方法编写单元测试,

我该怎么做:

  1. 的App.config
  2. 在我的单元测试方法中
  3. 我如何模拟这个?

    我只对Current.Server.Mappath()而不是Path.Combine()

    进行单元测试

3 个答案:

答案 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"
...}