11

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

4

3 回答 3

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);
    }
}
于 2013-10-24T10:20:56.540 回答
9

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

这是它的工作原理:

var expectedPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "path");
using (new FakeHttpContext())
{
    var mappedPath = Http.Context.Current.Server.MapPath("path");
    Assert.Equal(expectedPath, mappedPath);
}
于 2016-01-25T08:44:16.073 回答
0

我正在使用 NSubstitute 并按如下方式实现它:

 var fakeContext = Substitute.For<HttpContextBase>();
fakeContext.Server.MapPath(Arg.Any<string>()).ReturnsForAnyArgs("/set-path/");
于 2019-10-07T21:58:49.757 回答