Excel文件生成器:如何测试生成的文件

时间:2013-09-12 17:46:12

标签: c# file unit-testing

我写了一个用c#编写的excel(xls - 97-2003)文件生成器。 这基本上是NPOI的包装器。

这是生成器的接口:

   public interface IExcelGenerator
   {
      /// <summary>
      /// Add or replace a cell in the file.
      /// </summary>
      /// <param name="cell"></param>
      void AddCell(Cell cell);

      /// <summary>
      /// Create the file in memory.
      /// </summary>
      /// <param name="fileName"></param>
      /// <returns></returns>
      IFile CreateFile(string fileName);
   }

生成器的最终结果是byte[](来自IFile对象),表示原始文件。

我的Cell课程已经过单元测试。现在我想对发电机本身进行单元测试。我需要声明单元格内容是正确的,以及应用于单元格的格式。

我看到的唯一方法是在内存中生成一个文件(byte[])并将其与我在磁盘上读取的文件进行比较。但是在Excel中打开文件并保存它的简单操作会增加很多重量(从6K到26K),即使内部没有任何改变。因此,即使单元格的内容正确,两个数组也几乎不会相同。

如何断言两个文件中的所有单元格具有相同的格式

3 个答案:

答案 0 :(得分:1)

对所有值和格式的清扫单元测试的替代方案可以选择关注关键任务方面。这样做时,您可以通过将byte []转换回C#类(在您的情况下通过NPOI)来对最终结果进行单元测试,或者您可以在将对象写入文件之前对其进行单元测试。

答案 1 :(得分:0)

我更喜欢的一种方法是创建一个预先格式化的模板&#34;我打开的电子表格,填充值,然后保存为/ stream,保持原始模板不变。需要手动检查模板,但模板可以包含格式,包括条件格式,公式等。使用这种方法,您可能只能比较值,并且比较值是微不足道的,不像验证格式,合并细胞等等。

答案 2 :(得分:0)

鉴于:

  • 必须使用我的生成器生成比较文件,因此其中没有“额外”信息,例如列widht,行高。等
  • 如果文件驻留在源代码管理中,检查它的简单事实似乎会影响文件(最后修改日期可能是?)
  • 我想确保将来不会破坏生成器,假设他的实际状态是正确的。
  • 我不想仅仅出于测试目的编写xls阅读器,因为我也必须测试它,所以它就像一个无限循环的测试......
  • 我不想使用底层图书馆(NPOI)来阅读我的测试中的文件,因为它可能在将来发生变化。

我得到的解决方案是首先生成文件并将结果byte[]输出到base64字符串。

byte[] bytes = //Result of the generator.
string result = Convert.ToBase64String(bytes)

然后我把这个字符串作为const放在我的测试中,然后我与它进行比较,而不是在磁盘上读取文件。