【发布时间】:2013-01-14 20:55:50
【问题描述】:
我正在阅读this topic,这是关于使用反射来测试私有变量...
但是我的单元测试没有这样的问题,而且我的代码是完全可测试的。
我发现唯一的问题是,为具有预期结果的复杂对象的每个属性进行断言非常耗时;特别是对于复杂对象的列表。
由于它是一个复杂的对象,除非我为每个对象实现IEquality,否则执行普通的Assert.AreEqual 不会给我正确的结果。
但即使我这样做了,这也不会告诉我断言期间哪个属性/字段的名称、预期值和实际值。
正确地,我们手动将每个属性值放入一个列表并执行单个CollectionAssertion,但这仍然很耗时,并且当断言发生时它只会告诉我元素值的索引不相等;它不会告诉我属性名称。这使得调试变得非常困难(我不得不进入调试模式并查看集合中的元素)。
所以我想知道,如果我编写一个递归反射方法,它将对两个复杂对象进行断言,它将告诉我每个属性名称、预期值、实际值。
这是一个好习惯还是坏习惯?
【问题讨论】:
-
我会说不好-您使测试与被测内容的内部关系过于密切。如果您需要
IEquality语义,请实现它。 -
我很确定至少有一个流行的框架支持基于反射的断言(例如提供两个 POCO).. stackoverflow.com/a/7440471/166390 (FluentAssertions) , stackoverflow.com/questions/318210/… (impl) , stackoverflow.com/a/2047576/166390 (xUnit)
-
@Oded 但使用 IEquality 它不会告诉我在进行断言时究竟在哪里失败。即 ClassA:IEquality,ClassA 是一个复杂对象,具有属性 ClassB AnotherObj,而 ClassB 有一个值 Property,导致 Equals 失败。在断言失败的情况下,我将不得不遍历整个 ClassA + ClassB 的所有属性才能找到它失败的确切位置......
-
@pst 是的,我也刚读过 xUnit。但如果它们是坏的,那它们为什么存在呢?
-
@KingChan 有些人发布东西只是为了发布东西!
标签: c# unit-testing reflection