我们编写了一个如下所示的测试。此测试要求我们为Equal
类创建了CodeTableItem
-overload:
ICollection<CodeTableItem> expectedValutaList = new List<CodeTableItem>();
expectedValutaList.Add(new CodeTableItem("DKK", "DKK"));
expectedValutaList.Add(new CodeTableItem("EUR", "EUR"));
RepoDac target = new RepoDac();
var actual = target.GetValutaKd();
CollectionAssert.AreEqual(expectedValutaList.ToList(),actual.ToList());
该测试工作正常,但不幸的是依赖于
Equality
功能,这意味着如果我再扩展一个字段的CodeTableItem
类,而忘记扩展Equals
功能,则单元测试仍会以绿色运行,尽管我们并未测试所有领域。我们要避免这种Equality
污染(请参阅Test Specific Equality),这种污染只是为了符合测试要求而编写的。我们尝试使用
OfLikeness
,并以这种方式重写了测试:ICollection<CodeTableItem> expectedValutaList = new List<CodeTableItem>();
expectedValutaList.Add(new CodeTableItem("DKK", "DKK"));
expectedValutaList.Add(new CodeTableItem("EUR", "EUR"));
var expectedValutaListWithLikeness =
expectedValutaList.AsSource().OfLikeness<List<CodeTableItem>>();
RepoDac target = new RepoDac();
ICollection<CodeTableItem> actual;
actual = target.GetValutaKd();
expectedValutaListWithLikeness.ShouldEqual(actual.ToList());
但是测试失败,因为
Capacity
不相等。我已经编写了多次通过反射运行的代码,并且通常最终实现了用于忽略字段的重载。有没有办法使用OfLikeness
或ShouldEqual
忽略某些字段?还是有其他解决此问题的方法? 最佳答案
为什么你不想那样做
我不认为从任何List<T>
创建一个相似图片都不会实现您想要的效果。据我了解,您想比较两个列表的内容。这与比较两个列表不同...
考虑一下Likeness所做的事情:它比较属性值。 List<T>
的属性是什么?
他们是
容量
计数
正如Nikos Baxevanis在他的答案中指出的那样,可以使用Without方法忽略Capacity属性的值,但这意味着仅Count属性保留。
换句话说,如果您这样做,这是:
expectedValutaListWithLikeness.ShouldEqual(actual.ToList());
在功能上将与此等效:
Assert.AreEqual(expected.Count, actual.Count)
换句话说,列表可能具有完全不同的数据,但是如果仅每个列表具有相同数量的元素,则测试仍将通过。那可能不是你想要的...
你应该怎么做
您可以使用相似度将每个元素相互比较。这样的事情应该起作用:
var expectedValutaList = new List<CodeTableItem>();
expectedValutaList.Add(new CodeTableItem("DKK", "DKK"));
expectedValutaList.Add(new CodeTableItem("EUR", "EUR"));
var expectedValutaListWithLikeness = from cti in expectedValutaList
select cti
.AsSource()
.OfLikeness<CodeTableItem>();
var target = new RepoDac();
var actual = target.GetValutaKd();
Assert.IsTrue(expectedValutaListWithLikeness.Cast<object>().SequenceEqual(
actual.Cast<object>()));
您也许还可以使用CollectionAssert进行断言,但是自从我上次使用MSTest以来已经有很多年了,我不记得该方法的怪癖...