C# CollectionAssert.AreEquivalent 具有不同类型的传递

问题描述 投票:0回答:1

必须编写 C# 单元测试,我不明白的一件事是为什么要使用此方法

CollectionAssert.AreEquivalent(new List<string> {"turn:foo.com"}, new []{ new Uri("turn:foo.com"));

通过? 第一个参数是字符串列表,第二个参数是 Uri 类型的数组。 List 和 Uri 类是默认的 .NET 类。

我搜索了可能的解释,但没有找到任何东西。

c# unit-testing
1个回答
0
投票

这似乎没有记录,但对参考源的检查表明,当Uri.Equals(object? comparand)

是等于Uri值的字符串时,
true
已被重写以返回
comparand
:

// we allow comparisons of Uri and String objects only. If a string
// is passed, convert to Uri. This is inefficient, but allows us to
// canonicalize the comparand, making comparison possible

即如果我有

string
Uri
值,则
object.Equals()
的返回是 不对称,并且取决于我首先传入的值:

var @string = "turn:foo.com";
var uri = new Uri("turn:foo.com");

Console.WriteLine("object.Equals(@string, uri) = {0}", object.Equals(@string, uri)); // False
Console.WriteLine("object.Equals(uri, @string) = {0}", object.Equals(uri, @string)); // True

演示小提琴:.NET 4.7.2.NET 8

因此,如果您的

CollectionAssert.AreEquivalent()
碰巧将集合视为非泛型
IEnumerable
ICollection
类型[1],并且仅将值作为对象进行枚举,并且碰巧使用
object.Equals(v2, v1)
调用
Uri
第一个参数中的值,您将得到您所看到的行为。


[1] 这是真的,例如为了

Microsoft.VisualStudio.TestTools.UnitTesting.CollectionAssert.AreEquivalent()
NUnit.Framework.CollectionAssert.AreEquivalent()
采用非泛型
ICollection
值作为参数,
NUnit.Framework.CollectionAssert.AreEquivalent()
采用非泛型
IEnumerable
值作为参数。

© www.soinside.com 2019 - 2024. All rights reserved.