Server.MapPath的单元测试

时间:2013-10-24 10:14:15

标签: c# unit-testing

我有一个方法。从硬盘检索文档。我不能通过单元测试来测试这个。它总是抛出异常无效的空路径或其他东西。如何测试。我暂时创建了单元测试会话。但我不能为这个Server.MapPath。怎么做?

3 个答案:

答案 0 :(得分:35)

您可以在Server.MapPath

上使用依赖注入和抽象
public interface IPathProvider
{
   string MapPath(string path);
}

生产实施将是:

public class ServerPathProvider : IPathProvider
{
     public string MapPath(string path)
     {
          return HttpContext.Current.Server.MapPath(path);
     }
}

测试一个:

public class TestPathProvider : IPathProvider
{
    public string MapPath(string path)
    {
        return Path.Combine(@"C:\project\",path);
    }
}

答案 1 :(得分:8)

如果您需要测试您无法或不想更改的旧代码,可以尝试FakeHttpContext

这是它的工作原理:

var expectedPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "path");
using (new FakeHttpContext())
{
    var mappedPath = Http.Context.Current.Server.MapPath("path");
    Assert.Equal(expectedPath, mappedPath);
}

答案 2 :(得分:0)

我正在使用NSubstitute,并按如下所示实现了它:

 var fakeContext = Substitute.For<HttpContextBase>();
fakeContext.Server.MapPath(Arg.Any<string>()).ReturnsForAnyArgs("/set-path/");