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

时间:2018-09-05 13:27:35

标签: c# moq xunit

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。

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

除了Stephane的回答。我会建议你:

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

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

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

  4. 创建抽象(Mock上方的接口或抽象类-(在您提供的代码中它不是模拟的,所以很难猜测为什么要这样))。

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

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

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

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

,您不会从配置文件中释放您的课程,因此,请使用这种方法从配置中释放您的课程: How to mock ConfigurationManager.AppSettings with moq