2

我写了一个用 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课程已经过单元测试。现在我想对生成器本身进行单元测试。我需要断言单元格内容是正确的,以及应用于单元格的格式。

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

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

4

4 回答 4

1

An alternative to a sweeping unit test of all values and formatting could be choosing to focus on mission critical aspects. When doing that you could unit test the final result by converting byte[] back to C# classes (via NPOI in your case), or you could simply unit test the objects before they are written to a file.

于 2013-09-12T18:20:38.093 回答
0

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

于 2013-09-12T18:36:58.720 回答
0

鉴于 :

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

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

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

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

于 2013-09-19T13:05:05.000 回答
0

要测试 excel 文件,您可以将其作为流读取并检查它例如

 Stream result = your generated result;
 using var package = new ExcelPackage(result);
 //Cell A
 Assert.Equal("Company", package.Workbook.Worksheets["Matrix"].Cells["A2"].GetValue<string>());
于 2021-10-14T08:32:01.397 回答