为什么所有对象都在智能感知中列出 Rhino 存根方法?

Why are all objects listing Rhino stub methods in intellisense?

我注意到有点恼人的是,每个对象(不是只是存根对象)都列出了所有常见的 Rhino 方法,例如 Visual Studio 中的 AssertNeverCalled。它使浏览 properties/methods 变得更加困难。

这是 Visual Studio 的错误(例如损坏的 Intellisense DB)还是 'feature' Rhino Mocks 的错误?

为了回答你的问题,我需要在 arrange 和 asserts 方法之间拆分我的答案。

您在引用类型实例上遇到这些扩展方法的原因是因为 VS IntelliSense 无论如何都不支持过滤这些方法:

public static IMethodOptions<object> Stub<T>(this T mock, Action<T> action) where T : class

正如您在上面的 stub 方法签名中看到的,对 T 类型的唯一约束是; T 必须是引用类型。

这就是 IntelliSense 在您的示例中不为您提供 stub 方法的原因(DateTime 是结构...)

所以 IntelliSense 为您提供引用类型排列方法的原因是:IntelliSense 限制 + Rhinomocks 设计(Moq 用 .Object 属性 解决了这个问题)。

为什么 IntelliSense 提供非引用类型的断言方法(你的例子...)?

这是一个 Rhinomocks 错误;基本上 Rhinomocks 不允许您生成非引用类型对象,并且对这些方法没有任何限制;

public static void AssertWasCalled<T>(this T mock, Action<T> action)

正如您在上面的签名中看到的,T 没有任何限制,这是您遇到的不一致行为(bug...)的根源

asserts 方法的引用类型应与 arrange 方法完全相同。