比较内存中的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%是相同的,只有一些小的差异。
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
方法不是每次都生成相同的文件,也许文件中有某种时间戳或序列号,您需要解析文件并比较解析后的版本,如果这是正在发生的事情。