如何忽略构造函数中的调用函数
本文关键字:调用 函数 何忽略 构造函数 | 更新日期: 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
}
}
笔记:
- 我不想添加接口,比如
Foo : IFoo
. - 我不想添加第二个构造函数。
当你模拟一个类时,会创建代理(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
}