我试图使用MSTEST比较.NET中单元测试中2个集合的内容。为了简单起见,不必使用.Sort()然后遍历集合并一次比较一个项目,我发现了新的非常酷的.Intersect扩展方法。
通过这样做似乎很有效:
Assert.AreEqual(expected.Count, actual.Intersect(expected).Count)
但是,现在我有一个需要区分大小写的测试,它会中断。我试过发送Intersect的第二个参数StringComparer.Ordinal,StringComparer.InvariantCulture和StringComparer.CurrentCulture ...没有运气..
以前有人经历过这个吗?
谢谢!
编辑:这是数据:
Actual:
(0) "FOO" String
(1) "foo" String
(2) "Foo" String
(3) "fOo" String
(4) "foO" String
(5) "BAR" String
(6) "BAR" String
(7) "BAZ" String
(8) "baz" String
(9) "foo" String
Expected:
(0) "FOO" String
(1) "foo" String
(2) "Foo" String
(3) "fOo" String
(4) "foO" String
(5) "BAR" String
(6) "BAR" String
(7) "BAZ" String
(8) "baz" String
(9) "foo" String
actual.Intersect(expected, StringComparer.CurrentCulture)
(0) "FOO" String
(1) "foo" String
(2) "Foo" String
(3) "fOo" String
(4) "foO" String
(5) "BAR" String
(6) "BAZ" String
(7) "baz" String
它似乎正在删除匹配的副本'foo',以及匹配的重复'BAZ'。也许有一种更好的方法来断言集合是否匹配?
_EDIT2:我认为Intersect()会删除重复项,这就是为什么它会破坏。我找到了CollectionAssert类。这正是我所需要的!谢谢! _
答案 0 :(得分:2)
出于测试目的,请使用CollectionAssert.AreEqual(actual, expected)
您正在寻找SequenceEqual,而不是Intersect。 Intersect返回两个序列的交集,即。他们之间共享的项目。在{1,2,3}和{3,4,5}上使用Intersect将返回3. SequenceEqual将返回false。
如果你没找到可以使用的CollectionAssert:
Assert.IsTrue(actual.SequenceEqual(expected))
答案 1 :(得分:1)
实现IEqualityComparer,如下所示:
Class StringCaseInsensitiveComparer
Implements IEqualityComparer(Of String)
Public Function Equals(ByVal s1 As String, ByVal s2 As String) As Boolean
Return s1.ToLower() = s2.ToLower()
End Function
Public Function GetHashCode(ByVal s As String) As Integer
Return s.GetHashCode()
End Function
End Class
然后,调用相交的重载:
Dim first As IEnumerable(Of TSource)
Dim second As IEnumerable(Of TSource)
Dim comparer As IEqualityComparer(Of TSource)
Dim returnValue As IEnumerable(Of TSource)
传递你刚刚制作的比较器实例。