0

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

示例代码:

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

3 回答 3

1

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

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

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

于 2012-04-25T13:15:15.390 回答
0

如何添加布尔标志

布尔标志 = 假;

[测试]

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

     }
    //some test
}
于 2012-04-25T09:34:09.057 回答
0

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

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

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

于 2012-04-25T09:32:15.723 回答