我们编写了一个如下所示的测试。此测试要求我们为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不相等。我已经编写了多次通过反射运行的代码,并且通常最终实现了用于忽略字段的重载。有没有办法使用OfLikenessShouldEqual忽略某些字段?还是有其他解决此问题的方法?

最佳答案

为什么你不想那样做

我不认为从任何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以来已经有很多年了,我不记得该方法的怪癖...

10-07 16:16