我对单元测试相当新,并且正在使用VS2010开发并运行我的测试。我有一个简单的测试,如下图所示,它简单地比较了2个System.Data.DataTableReader对象。我知道它们是相同的,因为它们都是使用相同的对象类型,相同的输入文件创建的,并且我已经验证了对象“看起来”相同。
我意识到我可能正在处理几个问题,一个是这是否正确使用Assert.AreEqual甚至是正确的方法来测试这个场景,另一个是我正在处理的主要问题这就是为什么这个测试因这个例外而失败的原因:
Failed 00:00:00.1000660 0 Assert.AreEqual failed.
Expected:<System.Data.DataTableReader>. Actual:<System.Data.DataTableReader>.
以下是失败的单元测试代码:
public void EntriesTest()
{
AuditLog target = new AuditLog();
target.Init();
DataSet ds = new DataSet();
ds.ReadXml(TestContext.DataRow["AuditLogPath"].ToString());
DataTableReader expected = ds.Tables[0].CreateDataReader();
DataTableReader actual = target.Entries.Tables[0].CreateDataReader();
Assert.AreEqual<DataTableReader>(expected, actual);
}
非常感谢任何帮助!
答案 0 :(得分:6)
据我所知,DataTableReader不会覆盖Equals
方法;因此,调用Equals
将是参考等式检查;两个单独的引用,失败的平等。
你想要的是集合断言。请致电CollectionAssert.AreEquivalent()
。如果订单很重要,请使用CollectionAssert.AreEqual()
。
答案 1 :(得分:2)
您实际在做的是检查2个DataReader是否具有相同的引用,但它们不是两个不同的实例。
也许创建一个帮助方法,遍历DataTables并比较每一行,或者正如其他人注意到的那样使用CollectionAssert
。
答案 2 :(得分:0)
默认情况下,检查正在进行参考相等;他们必须引用同一个对象。我建议更改您的测试以检查读者是否返回相同的值。
答案 3 :(得分:0)
我猜测平等与数据读取器不同。如果要比较两个记录,则需要执行以下操作:
Assert.AreEqual(expected.FieldCount, actual.FieldCount);
for(int i = 0; i < expected.FieldCount; i++)
{
Assert.AreEqual(expected[i], actual[i]);
}
答案 4 :(得分:0)
我猜你试图测试来自阅读器的数据是否相同,而不是读者本身是相同的。我希望这会导致对象比较(对象在内存对象中是相同的),结果显然是假的。
尝试获取数据并进行比较。