如何忽略构造函数中的调用函数?
我有构造函数调用构造函数的类。当我为这个类创建模拟时,函数是从构造函数中调用的。我想阻止函数调用。我可以做吗?如何忽略构造函数中的调用函数?
示例代码:
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
}
}
注:
- 我不希望添加接口,像
Foo : IFoo
。 - 我不想添加第二个构造函数。
一般来说,您只能创建接口或抽象类的模拟。
你打算测试什么?如果是Foo类,那么创建它的模拟是完全错误的。
通常情况下,您会创建被测试类的那些依赖关系的模拟,这些依赖关系难以设置或需要很长时间才能运行。这种依赖关系的最常见示例是存储库或Web服务。
你正在写。这是一个简单的例子,但这个例子显示了我的问题。让我们把Foo当成抽象类吧。 – Rougher 2012-04-25 09:55:04
无论如何,如果你测试Foo,那么创建if的模拟是错误的方法。 – 2012-04-25 10:23:43
@IvanGerken:*“你可以创建模拟接口或抽象类”* - 这是不正确的;犀牛也可以嘲笑普通课程,没有什么特别的。如果这个类暴露了虚拟方法,那么这些方法就可以被模仿,就好像它是一个接口一样。 – 2012-04-25 12:09:22
abt如何添加布尔标记
布尔标志= false;
[测试]
public void Test_Foo()
{
if(flag == true)
{
Foo foo = MockRepository.GenerateMock<Foo>();
}
//some test
}
我不想避免调用MockRepository.GenerateMock
当你嘲笑的一类,还有创建的代理(犀牛使用Castle.DynamicProxy.DefaultProxyBuilder),它从你的类继承。继承和C#中的任何地方一样。当您创建派生类型的实例时,将调用基类型的所有构造函数(直到对象)。因此,当创建代理实例(通过Activator.CreateInstance(typeof(proxy)))时,Foo的构造函数也会被调用。你无法避免这一点。你可以使用接口模拟,或者向构造函数提供一些参数来禁止初始化。嘲讽抽象或具体类会嘲笑模拟的所有优点 - 您的测试取决于,它不会被模拟(构造器,非虚拟方法和默认实现)。而且你的SUT(被测系统)不再被单独测试。破坏的测试可能是抽象或具体类内部发生变化的结果。
你不能那样做。您可能需要添加第二个构造函数或将'.Initialize'委托给依赖项并注入。你究竟在测试什么?测试嘲弄的对象毫无意义,我希望你知道。 – 2012-04-25 12:07:11
您可以在不使用'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