Dan*_*iel 4 .net c# unit-testing mstest
我一直在寻找为控制器控制器实现单元测试,特别是测试集合.在MSDN示例中,使用CollectionAssert.Contains()确认对象是否出现在列表中.
我有一个List<myObject>where myObject器件IEquatable(即实现一个Equals(),以便List<myObject>.Contains()能够正确识别存在(或列表中不存在类型的对象myObject).
然而,CollectionAssert.Contains()(对于MS-VS测试,而不是nunit)功能似乎不会调用Equals().所以我想知道它是否适用于简单数组?如果没有,它如何比较自定义对象?
在这种情况下,我只是将我的断言更改为Assert.IsTrue(myList.Contains(myObjectInstance)).
查看代码CollectionAssert.Contains(),通过迭代集合并将每个元素与目标元素进行比较来完成实际比较object.Equals(current, target).
所以你的问题的答案是,如果你没有覆盖它的object版本,Equals()以便它发送到你的IEquatable<T>版本,你应该.否则,如果不满足引用相等性,则测试将失败,因为IEquatable<T>重载Equals()不会覆盖从中继承的重载object.
小智 5
CollectionAssert.Contains 似乎不是在查看对象的成员值,而是在比较实例的内存地址。以下示例的 CollectionAssert 将失败,因为尽管它们具有相同的成员值,但 obj 和 obj2不是同一个实例对象;
MyType obj = new MyType { prop1 = "foo", prop2 = "bar" };
MyType obj2 = new MyType { prop1 = "foo", prop2 = "bar" };
List<MyType> lstObj = new List<MyType> { obj2 };
CollectionAssert.Contains(lstObj, obj);
Run Code Online (Sandbox Code Playgroud)
话虽如此,以下示例的 CollectionAssert 将成功,因为它将搜索 obj2,而不是任何等于 obj2 的对象;
MyType obj = new MyType { prop1 = "foo", prop2 = "bar" };
MyType obj2 = new MyType { prop1 = "foo", prop2 = "bar" };
List<MyType> lstObj = new List<MyType> { obj2 };
CollectionAssert.Contains(lstObj, obj2);
Run Code Online (Sandbox Code Playgroud)
换句话说,CollectionAssert.Contains 比较实例和 List(T).Contains“通过使用默认的相等比较器来确定相等性,如对象的 IEquatable.Equals 方法的实现所定义的 T(列表中的值的类型)。 ”
参考:http : //msdn.microsoft.com/en-us/library/bhkz42b3.aspx