我有一个类,构造函数在构造函数中调用一个函数。当我为这个类创建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
}
}
注意:
Foo : IFoo
。答案 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
}