必须编写 C# 单元测试,我不明白的一件事是为什么要使用此方法
CollectionAssert.AreEquivalent(new List<string> {"turn:foo.com"}, new []{ new Uri("turn:foo.com"));
通过? 第一个参数是字符串列表,第二个参数是 Uri 类型的数组。 List 和 Uri 类是默认的 .NET 类。
我搜索了可能的解释,但没有找到任何东西。
这似乎没有记录,但对参考源的检查表明,当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
第一个参数中的值,您将得到您所看到的行为。
Microsoft.VisualStudio.TestTools.UnitTesting.CollectionAssert.AreEquivalent()
? NUnit.Framework.CollectionAssert.AreEquivalent()
采用非泛型 ICollection
值作为参数,NUnit.Framework.CollectionAssert.AreEquivalent()
采用非泛型 IEnumerable
值作为参数。