从物理路径读取csv文件是单元测试用例中的有效方案吗?为什么?


string _inboundFilePath = AppDomain.CurrentDomain.BaseDirectory + @"InboundCompareDataFile.csv";
var mockReaderStream = new Mock<IReaderStream>();
mockReaderStream.Setup(x => x.CreateStream())
.Returns(new System.IO.StreamReader(_inboundFilePath));

在这里,我依赖于入站文件从中读取数据,然后执行其他功能检查。 我的问题是如何避免这种情况?在这种情况下,我正在检查来自csv的特定ID的数据。

这不太可能是一个好的做法,因为单元测试必须是确定性的。这意味着无论情况如何,您都必须确保如果运行此测试,它将执行与以前完全相同的操作。

如果您读取 csv 文件,测试将取决于外部世界。不幸的是,外部世界并不稳定。首先,有人可以更改csv文件。

这就是为什么更好的做法是从程序集中的嵌入资源获取 csv 文件流,而不是从硬盘驱动器上的文件获取它。

除了斯蒂芬的回答。我会建议你:

  1. 将 @"\Inbound\CompareDataFile.csv" 放入配置文件。

  2. 在上述类中创建公共属性或单独的方法,以便能够检索和返回入站文件的绝对路径(称为GetPath(。

  3. 创建有权访问配置文件的单元测试方法。此测试方法必须读取配置文件,调用AppDomain.CurrentDomain.BaseDirectory。所以这个方法也可以检索入站文件绝对路径的路径,在此调用之后GetPath((

  4. 创建抽象(Mock 上方的接口或抽象类 - (顺便说一下,在你提供的代码中它不是一个模拟,所以很难猜到你为什么这么称呼它((。

  5. 在上述类中创建需要抽象对象的公共方法,并调用其方法ReadFromCsv((。

  6. 创建将实现此抽象的测试类(模拟(,并在调用其方法ReadFromCsv((时返回所需/不需要的值。

  7. 最后,测试你的班级。

这不是测试类的严格算法,您可以使用它。你想从这七个项目中得到的是单元测试相似性的概念。

此外,您不会从配置文件中释放您的类,因此,使用此方法将类从 config 中释放出来: 如何模拟配置管理器.应用程序设置与最小起订量

相关内容

最新更新