将内存中的byte []与File.ReadAllBytes()中的byte []进行比较,是否可以匹配?

时间:2015-06-09 23:25:52

标签: c# .net unit-testing io

我正在针对API编写一些单元测试,基本上,它会占用一些填充的对象并输出byte[],然后可以将其作为Excel文件输出(这就是应用程序对它的作用,但可能是不相关的。)

我想编写一个测试来验证,鉴于一些填充的对象我收到了一个预期的byte[]数组,所以我的方法是使用以前输出的Excel文件,并在测试时加载它时间与代码输出的应该进行比较。我是通过File.ReadAllBytes()阅读来获取byte[]数组,然后将其与应用中生成的byte[]数组进行比较。

我理解.NET中二进制可重复性的问题,但我不确定这是否适用于这种情况。任何人都可以提供有关字节数组不匹配的原因吗?我的猜测是从磁盘读取文件会在二进制数据中出现一些差异,或者使用GetString()方法在运行时以某种方式更改数据。

我的代码如下:

// The data generated by the app
var data = reportGenerator.GenerateReport(timeFrame, date);
// The expected data
var compareData = File.ReadAllBytes(@"Deployment\TestData.xls");

// Get string representation of the data for comparison
var dataString = Encoding.ASCII.GetString(data);
var compareDataString = Encoding.ASCII.GetString(compareData);

// Compare, Fails
Assert.AreEqual(dataString, compareDataString);

数据几乎匹配,但它并不完全相同。在Beyond Compare中查看字符串时,它们可能有99.9%的相同而且存在一些小差异。

2 个答案:

答案 0 :(得分:0)

使用集合而不是使用Assert时,请在同一名称空间中使用类CollectionAssert

您可能想要CollectionAssert.AreEqual

  

如果两个集合在相同的顺序和数量中具有相同的元素,则它们是相等的。如果元素的值相等,则元素相等,而不是它们引用相同的对象。

// The data generated by the app
var data = reportGenerator.GenerateReport(timeFrame, date);
// The expected data
var compareData = File.ReadAllBytes(@"Deployment\TestData.xls");

// expected data comes first in a Assert method.
CollectionAssert.AreEqual(compareData, data);

至于为什么GetString不起作用,可能是您的数据无效ASCII文本,将任意二进制数据传递到GetString不起作用,正确的转换方式字符串格式的非字符串二进制数据是使用Convert.ToBase64String

对Base64进行编码
// The data generated by the app
var data = reportGenerator.GenerateReport(timeFrame, date);
// The expected data
var compareData = File.ReadAllBytes(@"Deployment\TestData.xls");

// Get string representation of the data for comparison
var dataString = Convert.ToBase64String(data);
var compareDataString = Convert.ToBase64String(compareData);

Assert.AreEqual(dataString, compareDataString);

如果这两种方法都不起作用,那么你的GenerateReport方法每次都不生成相同的文件,也许文件中有某种时间戳或序列号,你需要解析文件并比较解析后的版本,如果发生了这种情况。

答案 1 :(得分:0)

Excel电子表格包含元数据,例如相关的日期和时间,创建工作表的用户,文件位置等。因此,在比较原始字节时,您似乎无法获得100%匹配文件到文件。

这涉及更多,但您需要从每个电子表格中查询数据,并在断言中对它们进行比较。例如,Office扩展允许您使用电子表格数据。还有一个Jet驱动程序,您可以使用OleDbConnection。在将大量病例喂入我的单元测试时,我经常使用它。可以在此CodeProject文章中找到一个示例:

Link to Article