当我执行我的测试用例时,它在我的机器中的路径失败了,它不存在并且我得到以下错误:
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();
}
}
答案 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"))
{
}
}
}
方法更清晰(不太受欢迎)