如何忽略构造函数中的调用函数

本文关键字:调用 函数 何忽略 构造函数 | 更新日期: 2023-09-27 18:32:15

我有构造函数在构造函数中调用函数的类。当我为这个类创建模拟时,函数是从构造函数调用的。我想阻止函数调用。我能做到吗?

示例代码:

public class Foo
{
    public Foo()
    {
        Initialize();
    }
    private void Initialize()
    {
        //some code
    }
}
[TestFixture]
public class Test
{
    [Test]
    public void Test_Foo()
    {
        Foo foo = MockRepository.GenerateMock<Foo>(); 
        //some test
    }
}

笔记:

  1. 我不想添加接口,比如Foo : IFoo.
  2. 我不想添加第二个构造函数。

如何忽略构造函数中的调用函数

当你模拟一个类时,会创建代理(Rhino 使用 Castle.DynamicProxy.DefaultProxyBuilder),它继承自你的类。继承的工作方式与 C# 中的任何位置完全相同。创建派生类型的实例时,将调用基类型(直到对象)的所有构造函数。

因此,当创建代理实例(通过 Activator.CreateInstance(typeof(proxy))时,Foo 的构造函数也会被调用。你无法避免这种情况。您可以使用接口模拟,或者向构造函数提供一些参数来禁用初始化。

顺便说一句,模拟抽象或具体类扼杀了模拟的所有优点 - 您的测试依赖于未被模拟的东西(构造函数、非虚拟方法和默认实现)。而且您的 SUT(被测系统)不再单独测试。损坏的测试可能是抽象或具体类内部某些更改的结果。

通常,您只能创建接口或抽象类的模拟。

你要测试什么?如果它是类 Foo,那么创建它的模拟是完全错误的。

通常,您会创建测试类的依赖项的模拟,这些依赖项难以设置或需要很长时间才能运行。这种依赖关系的最常见示例是存储库或 Web 服务。

如何添加布尔标志

布尔标志 = 假;

[测试]

public void Test_Foo()
{
     if(flag == true)
     {
      Foo foo = MockRepository.GenerateMock<Foo>(); 
     }
    //some test
}