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

时间:2012-04-25 09:23:13

标签: c# unit-testing rhino-mocks

我有一个类,构造函数在构造函数中调用一个函数。当我为这个类创建mock时,从构造函数调用函数。我想阻止函数调用。我可以这样做吗?

示例代码:

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. 我不想添加第二个构造函数。

3 个答案:

答案 0 :(得分:1)

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

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

BTW模拟抽象或具体类会破坏模拟的所有优点 - 您的测试依赖于未模拟的某些(构造函数,非虚方法和默认实现)。并且您的SUT(被测系统)不再被隔离测试。破坏的测试可能是抽象或具体类内部的一些变化的结果。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

如何添加布尔标志

Boolean flag = false;

[测试]

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

     }
    //some test
}