Mock 的基础 class 是什么?

What is the base class of a Mock?

如果我有一个模拟对象:

var mock = new Mock<myClass>();

mock 的底 class 是多少?


我的问题的原因是因为我正在调试以下内容:

var mock = new Mock<myClass>();
mock.Object.someMethod(); //stepping through this line by line, it does not set focus to **myClass**

但是,当我将 CallBase 设置为 true 时,我确实看到编译器是 运行 通过 myClass:

中的代码
var mock = new Mock<myClass>();
mock.CallBase = true;
mock.Object.someMethod();

这是否意味着 mock 的基础 class 是它正在模拟的 class?

它不一定有基数 class。

当您键入您拥有的代码时,您正在为 myClass

的具体类型创建 class Mock 实例
class myClass<T>
{
  private T _Instance;

  public myClass(T instance){
  _Instance = instance;
}

如上例所示,"myClass"

没有 baseClass

不,这不是这个意思,mock.CallBase = true; 你告诉 Moq 直接使用类型的实例。 Moq.CallBase

它在泛型参数中实现了类似 Proxy-Pattern 的类型,但您可以 stub virtual 方法 (存根一些非虚拟方法的任何现有变通方法),例如,如果您在通用参数中传递一个 interface,您可以 存根 所有方法和属性,但是如果你只传递一个具体的 class virtual 方法你可以 stub return.

它所做的实际上是使用 class 的默认构造函数创建 class 实例,然后覆盖 class 中的 public 虚拟方法反射。

这些方法的默认行为是什么也不做。 当你说 mock.Callbase = true 它告诉模拟如果你没有提供任何设置函数它应该使用它的模拟类型的方法。

您可以将其视为模拟派生自您的 class 并覆盖方法,如果您设置 mock.Callbase = true,它会调用 base.someMethod()。但实际上不是,这意味着对 class 的转换会失败,因为它是在反射中进行的

希望我解释清楚了