单元测试时找不到目录

时间:2017-06-01 06:53:17

标签: c# unit-testing directory

当我执行我的测试用例时,它在我的机器中的路径失败了,它不存在并且我得到以下错误:

  

System.IO.DirectoryNotFoundException:找不到部分内容   路径' C:\ Data1'。

我是否需要某种虚假/模拟来传递测试用例,或者我们还有其他方法可以做到这一点吗?

public class DemoCls
{
    public void Execute()
    {
        string dataFolder = @"C:\\Data1";
        foreach (string X in Directory.EnumerateFiles(dataFolder, "test" + "*.xml"))
        {
        }
    }
}

测试用例

[TestClass()]
public class DemoClsTests
{
    [TestMethod()]
    public void ExecuteTest()
    {
        var X = new DemoCls();
        X.Execute();
    }
}

2 个答案:

答案 0 :(得分:2)

应重构类以消除与实现问题的紧密耦合,这使得难以测试。

//...Creat an abstraction that provides the desired behavior as a contract
public interface IDirectoryService {
    IEnumerable<string> EnumerateFiles(string path, string searchPattern);
}

可以在测试时创建假/模拟,以避免与单独测试IO代码相关的陷阱。

可以使用模拟框架来存根依赖项,但是对于此示例使用简单的

public class FakeDIrectoryService : IDirectoryService {
    IEnumerable<string> files;
    public FakeDIrectoryService(IEnumerable<string> files) {
        this.files = files;
    }
    public IEnumerable<string> EnumerateFiles(string path, string searchPattern = null) {
        return files;
    }
}

现在需要重构类以通过构造函数和方法注入跟随Explicit Dependencies Principle

public class DemoCls {
    IDirectoryService directory;
    public DemoCls(IDirectoryService directory) {
        this.directory = directory;
    }

    public void Execute(string dataFolder) {
        foreach (var x in directory.EnumerateFiles(dataFolder, "test*.xml")) {
            //...
        }
    }
}

现在可以单独正确地进行测试。

[TestClass()]
public class DemoClsTests {
    [TestMethod()]
    public void ExecuteTest() {
        //Arrange
        var fakePath = "C:/temp";
        var fakeFiles = new[] { 
            @"C:\\temp\\testfakefilename1.txt", 
            @"C:\\temp\\testfakefilename2.txt",
            @"C:\\temp\\testfakefilename3.txt" 
        };
        var service = new FakeDIrectoryService(fakeFiles);
        var sut = new DemoCls(service);

        //Act
        sut.Execute(fakePath);

        //Assert
        //perform your assertions
    }
}

最后,对于生产代码,文件服务的真正实现可以包装任何源,无论是磁盘还是远程服务。

例如

public class FileService : IDirectoryService {
    public IEnumerable<string> EnumerateFiles(string path, string searchPattern) {
        return Directory.EnumerateFiles(path, searchPattern);
    }
}

这只是可以做什么的一个例子。还有很大的改进空间,但这应该可以开始。

答案 1 :(得分:0)

硬编码路径不好,我建议使用两个选项,因为类不是静态的。

<强>第一

window.addEventListener('resize', function (e) {
  var currentWidth = window.innerWidth;
  if (currentWidth >= WIDTH_LIMIT) {
    // do something
  }
});

这使事情更加灵活和可重复使用

<强>第二

public class DemoCls
{
    public void Execute(string targetPath)
    {
        foreach (string X in Directory.EnumerateFiles(targetPath, "test" + "*.xml"))
        {
        }
    }
}

这样可以使public class DemoCls { private string _targetPath; public DemoCls(string targetPath){ _targetPath = targetPath; } public void Execute(string targetPath) { foreach (string X in Directory.EnumerateFiles(targetPath, "test" + "*.xml")) { } } } 方法更清晰(不太受欢迎)