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

问题描述:

我有构造函数调用构造函数的类。当我为这个类创建模拟时,函数是从构造函数中调用的。我想阻止函数调用。我可以做吗?如何忽略构造函数中的调用函数?

示例代码:

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

你不能那样做。您可能需要添加第二个构造函数或将'.Initialize'委托给依赖项并注入。你究竟在测试什么?测试嘲弄的对象毫无意义,我希望你知道。 – 2012-04-25 12:07:11

+0

您可以在不使用'FormatterServices.GetUninitializedObject(...)'调用构造函数的情况下创建Foo的实例。详情请看这里:http://stackoverflow.com/questions/178645/how-does-wcf-deserialization-instantiate-objects-without-calling-a-constructor – JYL 2015-02-17 13:57:24

一般来说,您只能创建接口或抽象类的模拟。

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

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

+0

你正在写。这是一个简单的例子,但这个例子显示了我的问题。让我们把Foo当成抽象类吧。 – Rougher 2012-04-25 09:55:04

+0

无论如何,如果你测试Foo,那么创建if的模拟是错误的方法。 – 2012-04-25 10:23:43

+0

@IvanGerken:*“你可以创建模拟接口或抽象类”* - 这是不正确的;犀牛也可以嘲笑普通课程,没有什么特别的。如果这个类暴露了虚拟方法,那么这些方法就可以被模仿,就好像它是一个接口一样。 – 2012-04-25 12:09:22

abt如何添加布尔标记

布尔标志= false;

[测试]

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

    } 
    //some test 
} 
+0

我不想避免调用MockRepository.GenerateMock ();. – Rougher 2012-04-25 09:56:09

当你嘲笑的一类,还有创建的代理(犀牛使用Castle.DynamicProxy.DefaultProxyBuilder),它从你的类继承。继承和C#中的任何地方一样。当您创建派生类型的实例时,将调用基类型的所有构造函数(直到对象)。因此,当创建代理实例(通过Activator.CreateInstance(typeof(proxy)))时,Foo的构造函数也会被调用。你无法避免这一点。你可以使用接口模拟,或者向构造函数提供一些参数来禁止初始化。嘲讽抽象或具体类会嘲笑模拟的所有优点 - 您的测试取决于,它不会被模拟(构造器,非虚拟方法和默认实现)。而且你的SUT(被测系统)不再被单独测试。破坏的测试可能是抽象或具体类内部发生变化的结果。