我打算为web api函数编写单元测试,该函数使用一行代码来使用Server.MapPath加载XML文件
从UnitTest项目运行时,同样会向我返回null。
这个问题的一个解决方案是从控制器传递文件到函数所以我可以在运行web api项目时使用Context.Current,Server.MapPath,并且从单元测试运行时我可以使用硬编码文件路径,
有没有其他方法可以为UnitTest和实际的Web api端点调用使用相同的代码行
答案 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);
}
}