使用同步文件操作进行单元测试

时间:2016-03-19 08:13:14

标签: c# unit-testing file-io

我的问题:

我想在我的项目中实现单元测试,该测试严重依赖于文件操作,包括ZIP提取,文件操作和验证以及最终的新输出文件。我一直坚持如何最好地实现它,因为目前正在使用同步的文件操作链。

我的场景:

项目的基本顺序如下:

  1. 提取ZIP文件(与名为Batch的类
  2. 相关联)
  3. 将每个提取的PDF文件加载到自己的Letter File类中,然后将这些类作为子项添加到Batch
  4. 对每个Letter File运行一些检查,以确保它有效,并确定它是什么类型的Letter File(这也有点依赖于文件夹结构)。例如,我阅读PDF以检查某个字符串,然后更改文件的处理方式。
  5. 提取的一些文件以更复杂的方式处理,它们将是CSV文件,我需要在提取ZIP后检查它们实际存在的文件。
  6. 最后,批处理用于创建引用每个字母的新CSV文档。
  7. 我被困在哪里:

    我已经开始通过在我的资源中存储一个带有两个好Letter Files的测试ZIP来进行单元测试,并且在单元测试开始时我运行一个方法来创建一个临时文件夹。我可以正确地测试文件提取并生成两个字母的文件输出而没有太多问题。

    问题在于,当我尝试进入下一个测试时,我需要存在以前的文件和类。我非常肯定单元测试应该能够彼此独立存在,所以我正在尝试找出实现这一目标的最佳方法。

    我考虑过的事情:

    1. 调用方法以遍历每个测试的操作的每个阶段。到最后一次测试时,我已经有效地在最后一次测试中多次运行了每次测试。

    2. 通过将每个元素存储为资源并将它们提取到应有的位置来伪造进程。我不认为这会对事情进行适当的测试,如果主要流程发生变化,我将不得不更新所有测试以反映这一点。

    3. 以某种方式欺骗文件系统..?

    4. 我已经意识到我可能在文件系统上实际执行了太多操作,而可以将它们移动到该类的操作上。例如,我目前阅读PDF,检查它是否有字符串,然后根据类中的结果设置枚举。我认为在类中存储PDF的字符串内容可能更有意义(即使只是暂时的),然后我可以欺骗它,并运行相同的比较。我不知道如何通过检查存在的文件的例子来解决这个问题。

      汇总问题:

      如何对严重依赖文件引用的类执行单元测试,尤其是某些结果依赖于先前测试/方法的输出?

1 个答案:

答案 0 :(得分:1)

Visual Studio Test具有ordered tests的概念。 BTW,MSDN文档声明:

  

在有序测试中,每个测试都是独立且独立的。所以   在每个运行的测试之间不保留环境状态。

因此,似乎订购测试以使某些先前测试中的某些文件和环境状态无法使用有序测试。

无论如何,您应该能够在执行测试的机器中的某个已知位置输出每个下一个测试所需的文件(按顺序),并且由于您的测试是按顺序执行的,因此您可以完全保证每个测试将按预期工作。