我正在针对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%的相同而且存在一些小差异。
答案 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
// 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文章中找到一个示例: