【问题标题】:How do I get fake path for HttpContext.Current.Server.MapPath which is assigned to protected object inside method unit testing?如何获取分配给方法单元测试中受保护对象的 HttpContext.Current.Server.MapPath 的假路径?
【发布时间】:2016-08-07 00:53:44
【问题描述】:

我是单元测试的新手,MSTest。我得到NullReferenceException

如何设置HttpContext.Current.Server.MapPath 进行单元测试?

class Account
{
    protected string accfilepath;

    public Account(){
        accfilepath=HttpContext.Current.Server.MapPath("~/files/");
    }
}

class Test
{
    [TestMethod]
    public void TestMethod()
    {
        Account ac= new Account();
    }
}

【问题讨论】:

标签: c# asp.net unit-testing mstest


【解决方案1】:

HttpContext.Server.MapPath 需要一个在单元测试期间不存在的底层虚拟目录提供程序。抽象服务背后的路径映射,您可以模拟它以使代码可测试。

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

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

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

您可以将抽象注入您的依赖类或需要和使用的地方

class Account {
    protected string accfilepath;

    public Account(IPathProvider pathProvider) {
        accfilepath = pathProvider.MapPath("~/files/");
    }
}

如果没有可用的模拟框架,请使用您选择的模拟框架或假/测试类,

public class FakePathProvider : IPathProvider {
    public string MapPath(string path) {
        return Path.Combine(@"C:\testproject\",path.Replace("~/",""));
    }
}

然后您可以测试系统

[TestClass]
class Test {

    [TestMethod]
    public void TestMethod() {
        // Arrange
        IPathProvider fakePathProvider = new FakePathProvider();

        Account ac = new Account(fakePathProvider);

        // Act
        // ...other test code
    }
}

并且不耦合到HttpContext

【讨论】:

    【解决方案2】:

    您可以创建另一个以路径为参数的构造函数。这样你就可以通过虚假路径进行单元测试

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-24
      • 2010-11-10
      • 2012-05-22
      • 2013-10-30
      • 1970-01-01
      • 1970-01-01
      • 2013-10-10
      • 1970-01-01
      相关资源
      最近更新 更多