【发布时间】:2010-03-14 04:30:40
【问题描述】:
CollectionAssert 似乎不能与泛型一起使用。这非常令人沮丧;我要测试的代码确实使用了泛型。我是什么做的?编写样板以在两者之间进行转换?手动检查集合等价性?
这失败了:
ICollection<IDictionary<string, string>> expected = // ...
IEnumerable<IDictionary<string, string>> actual = // ...
// error 1 and 2 here
CollectionAssert.AreEqual(expected.GetEnumerator().ToList(), actual.ToList());
// error 3 here
Assert.IsTrue(expected.GetEnumerator().SequenceEquals(actual));
编译器错误:
错误 1:
“System.Collections.Generic.IEnumerator>”不包含“ToList”的定义,并且找不到接受“System.Collections.Generic.IEnumerator>”类型的第一个参数的扩展方法“ToList”
错误 2
“System.Collections.Generic.IEnumerator>”不包含“ToList”的定义,并且找不到接受“System.Collections.Generic.IEnumerator>”类型的第一个参数的扩展方法“ToList”
错误 3
“System.Collections.Generic.IEnumerator>”不包含“SequenceEquals”的定义,并且找不到接受“System.Collections.Generic.IEnumerator>”类型的第一个参数的扩展方法“SequenceEquals”
我做错了什么?我没有正确使用扩展程序吗?
更新:好的,这看起来好多了,但还是不行:
IEnumerable<IDictionary<string, string>> expected = // ...
IEnumerable<IDictionary<string, string>> actual = // ...
CollectionAssert.AreEquivalent(expected.ToList(), actual.ToList()); // fails
CollectionAssert.IsSubsetOf(expected.ToList(), actual.ToList()); // fails
我不想比较列表;我只关心集合成员的平等。成员的顺序并不重要。我该如何解决这个问题?
【问题讨论】:
-
你确定吗?它一直给我编译器错误,我将在明天早上发布。
-
我错了; CollectionAssert 不适用于 ICollection
。它仅适用于 ICollection。这已在 Connect 上提出请求,但到目前为止尚未实施。可能的解决方法:stackoverflow.com/questions/662458/… -
如果我没记错的话,ICollection 和 ICollection
接口是完全不同的。这不是 IEnumerable 与 IEnumerable 的情况。请检查他们的方法。 ICollection 用于除 ICollection 之外的其他内容。 ICollection 甚至没有 ADD 方法——它用于“更底层”的目的,如多线程和编组。所以,我觉得你还是应该找一个更适合你需求的接口,简单的IEnumerable也许吧? -
“成员的顺序并不重要”——这正是
CollectionAssert.AreEquivalent的用途。您在测试中收到的失败信息是什么? (也许你的预期和实际不等价!) -
这是SequenceEqual,不是SequenceEquals,那可能是你的编译错误
标签: c# .net unit-testing generics mstest