在单元测试项目中使用Server.Mappath

时间:2016-05-30 11:10:42

标签: c# unit-testing asp.net-web-api

我打算为web api函数编写单元测试,该函数使用一行代码来使用Server.MapPath加载XML文件

从UnitTest项目运行时,同样会向我返回null。

这个问题的一个解决方案是从控制器传递文件到函数所以我可以在运行web api项目时使用Context.Current,Server.MapPath,并且从单元测试运行时我可以使用硬编码文件路径,

有没有其他方法可以为UnitTest和实际的Web api端点调用使用相同的代码行

1 个答案:

答案 0 :(得分:0)

Server.MapPath将需要一个底层虚拟目录提供程序,它在单元测试期间不存在。摘要可以模拟使代码可测试的服务背后的文件内容检索。

public interface IPathProvider {
    string MapPath(string path);
}

在具体服务的实现中,您可以调用映射路径并检索文件。

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

在单元测试中,您可以模拟服务以返回测试所需的数据。

以下是 Moq

的示例
//Arrange
var path = "~/resources/file.xml";
var expected = "My/Hard/Coded/File/Path/File.xml";
public mock = new Mock<IPathMapper>();
mock.Setup(m => m.MapPath(path)).Returns(expected);
IPathMapper mapper = mock.Object.
IMyFIleLoader loader = new MyFIleLoader(mapper);

//Act
var actual = loader.Load(path);

//Assert
mock.Verify(m => m.MapPath(path));
//...other code removed for brevity

以下是使用假/测试类

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

参考Unit testing for Server.MapPath