模拟的基类是什么?

时间:2016-03-07 16:24:53

标签: c# unit-testing nunit moq

如果我有一个模拟对象:

var mock = new Mock<myClass>();

mock的基类是什么?

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

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();

这是否意味着模拟的基类是它正在模拟的类?

3 个答案:

答案 0 :(得分:1)

不,这并不意味着,mock.CallBase = true;告诉 Moq 直接使用该类型的实例。的 Moq.CallBase 即可。

它实现了类似于通用参数中类型的 Proxy-Pattern ,但您可以存根 virtual方法(存在一些非虚拟方法的存在变通方法,例如,如果你在泛型参数中传递interface,你可以存根所有方法和属性,但是如果你通过了仅具体类virtual方法,您可以存根返回。

答案 1 :(得分:1)

它的作用实际上是使用类的默认构造函数创建类的实例,然后在反射中覆盖类的公共虚方法。

方法的默认行为是什么都不做。 当你说mock.Callbase = true它告诉模拟器,如果你没有提供任何设置功能,它应该使用其模拟类型的方法。

您可以将其视为模拟从您的类派生并覆盖方法,如果您设置mock.Callbase = true则调用base.someMethod()。但实际上它不是,这意味着你的班级演员会失败,因为它是在反思中做的

希望我自己解释

答案 2 :(得分:0)

它根本不一定有基类。

当您输入所拥有的代码时,您将为 myClass

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

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

如上例所示,&#34; myClass&#34;

没有baseClass