我打算为Web api函数编写单元测试,该函数使用一行代码来使用Server.MapPath加载XML文件。
从UnitTest项目运行时,同样向我返回null。
解决此问题的一种方法是从控制器将文件名传递给函数,因此我可以在运行Web api项目时使用Context.Current,Server.MapPath,从单元测试运行时可以使用硬编码的文件路径,
还有什么其他方法可以让我对UnitTest和实际的Web api端点调用使用同一行代码
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);
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句