【问题标题】:Using Server.Mappath in a Unit Testing project [duplicate]在单元测试项目中使用 Server.Mappath [重复]
【发布时间】:2016-09-28 04:44:49
【问题描述】:

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

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

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

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

【问题讨论】:

  • Server.MapPath 需要一个在单元测试期间不存在的底层虚拟目录提供程序。抽象服务背后的文件内容检索,您可以模拟该服务以使代码可测试。在具体服务的实现中,您可以调用映射路径并检索文件。在单元测试中,您可以模拟服务以返回测试所需的任何数据。

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2013-11-02
    • 1970-01-01
    • 2015-11-02
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多