繁体   English   中英

在单元测试案例中,从物理路径读取csv文件是否有效? 为什么?

[英]Is reading csv file from physical path is valid scenario in unit test case ? why?

string _inboundFilePath = AppDomain.CurrentDomain.BaseDirectory + @"\Inbound\CompareDataFile.csv";

var mockReaderStream = new Mock<IReaderStream>();
mockReaderStream.Setup(x => x.CreateStream())
    .Returns(new System.IO.StreamReader(_inboundFilePath));

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

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

如果您读取一个csv文件,则测试将取决于外部环境。 不幸的是,外部世界是不稳定的。 首先,可以更改csv文件。

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

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

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

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

  3. 创建有权访问配置文件的UnitTest方法。 此TestMethod必须读取配置文件,并调用AppDomain.CurrentDomain.BaseDirectory 因此,此方法还可以检索入站文件的绝对路径,并在此调用之后获取GetPath()

  4. 创建抽象(Mock上方的接口或抽象类-(在您提供的代码中它不是模拟的,因此很难猜测为什么如此称呼))。

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

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

  7. 最后,测试您的课程。

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

同样,您也不会从配置文件中释放类,因此,请使用这种方法从配置中释放类: 如何使用moq模拟ConfigurationManager.AppSettings

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM