gpt4 book ai didi

c# - Microsoft.VisualStudio.TestTools.UnitTesting.Assert 泛型方法重载行为

转载 作者:太空狗 更新时间:2023-10-29 21:33:40 26 4
gpt4 key购买 nike

Microsoft.VisualStudio.TestTools.UnitTesting命名空间,有方便的静态类 Assert处理测试中发生的断言。

让我感到困扰的是,大多数方法都极度重载,最重要的是,它们有一个通用版本。一个具体的例子是 Assert.AreEqual其中有 18 个重载,其中:

Assert.AreEqual<T>(T t1, T t2)

这个泛型方法有什么用?最初,我认为这是一种直接调用 IEquatable<T> Equals(T t) 的方法。方法,但事实并非如此;它将始终调用非通用版本 object.Equals(object other) .在编写了很多预期该行为的单元测试后,我发现了困难的方法(而不是像我应该的那样事先检查 Assert 类定义)。

为了调用通用版本Equals ,泛型方法必须定义为:

Assert.AreEqual<T>(T t1, T t2) where T: IEquatable<T>

是否有充分的理由说明为什么不这样做?

是的,对于所有未实现 IEquatable<T> 的类型,您都放弃了通用方法, 但无论如何这并不是一个很大的损失,因为平等将通过 object.Equals(object other) 检查, 所以 Assert.AreEqual(object o1, object o2)已经足够好了。

当前的通用方法是否提供了我没有考虑到的优势,或者只是没有人停下来考虑它,因为这不是什么大不了的事?我看到的唯一优势是参数类型安全,但这似乎有点差。

编辑:修复了我一直引用 IComparable 的错误当我的意思是IEquatable .

最佳答案

由于 constraints not being part of the signature 经常面临的问题,具有该约束的方法将不是理想的.

问题在于,对于任何未被其自身特定重载涵盖的 T,编译器将选择通用 AreEqual<T>方法作为重载决议期间的最佳选择,因为它确实会通过精确匹配。在该过程的不同步骤中,编译器将评估 T 通过约束。对于任何未实现 IEquatable<T> 的 T ,此检查将失败并且代码将无法编译。

考虑单元测试库代码的这个简化示例和您的库中可能存在的类:

public static class Assert
{
public static void AreEqual(object expected, object actual) { }
public static void AreEqual<T>(T expected, T actual) where T : IEquatable<T> { }
}

class Bar { }

Class Bar 没有实现约束中的接口(interface)。如果我们然后将以下代码添加到单元测试中

Assert.AreEqual(new Bar(), new Bar());

由于对最佳候选方法的约束不满足,代码将无法编译。 ( Bar 替代 T,这使得它比 object 更好。)

The type 'Bar' cannot be used as type parameter 'T' in the generic type or method 'Assert.AreEqual<T>(T, T)'. There is no implicit reference conversion from 'Bar' to 'System.IEquatable<Bar>'.

为了满足编译器并允许我们的单元测试代码编译和运行,我们必须至少将方法的一个输入强制转换为object。这样就可以选择非泛型重载,这对于可能存在于您自己的代码或您使用的代码中的任何给定 T 都是正确的,您希望在您的测试用例中使用不实现接口(interface)。

Assert.AreEqual((object)new Bar(), new Bar());

所以必须要问这个问题——这样理想吗?如果您正在编写一个单元测试库,您会创建一个具有如此不友好限制的方法吗?我怀疑您不会,Microsoft 单元测试库的实现者(无论是否出于这个原因)也没有。

关于c# - Microsoft.VisualStudio.TestTools.UnitTesting.Assert 泛型方法重载行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25648195/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com