比较内存中的byte[]与File.ReadAllBytes()中的byte[],可能匹配

本文关键字:byte 中的 File 内存 ReadAllBytes 比较 | 更新日期: 2023-09-27 17:54:39

我正在编写一些针对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%是相同的,只有一些小的差异。

比较内存中的byte[]与File.ReadAllBytes()中的byte[],可能匹配

Excel电子表格包含元数据,如相关日期和时间、创建工作表的用户、文件位置等。因此,当从一个文件到另一个文件比较原始字节时,似乎不可能得到100%的匹配。

这有点复杂,但是您需要从每个电子表格中查询数据,并在断言中比较它们。例如,有一些Office扩展可以让你处理电子表格数据。还有一个Jet驱动程序可以与OleDbConnection一起使用。在单元测试中输入大量用例时,我经常使用它。在这篇CodeProject文章中可以找到一个示例:

链接到文章

当使用集合而不是使用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方法不是每次都生成相同的文件,也许文件中有某种时间戳或序列号,您需要解析文件并比较解析后的版本,如果这是正在发生的事情。