2013-04-22 45 views
1

我正在为具有依赖关系的服务方法进行单元测试。简化:使用Rhino存根的UnitTest的极限范围

public class ConditionChecker 
{ 
    private SqlConnection _connection; 

    public bool CanDoSomething() 
    { 
     return _connection.State == ConnectionState.Open; 
    } 
} 

public class A 
{ 
    public ConditionChecker Checker { get; set; } 

    public bool CanInvokeA() 
    { 
     return Checker.CanDoSomething(); 
    } 
} 

[TestClass] 
public class ATests 
{ 
    [TestMethod] 
    public void TestCanInvokeA() 
    { 
     // arrange 
     A a = new A(); 
     ConditionChecker checker = MockRepository.GenerateStub<ConditionChecker>(); 
     checker.Stub(x => x.CanDoSomething()).Return(true); 
     a.Checker = checker; 

     // act 
     bool actual = a.CanInvokeA(); 

     // assert 
     Assert.AreEqual(true, actual); 
    } 
} 

我想是完全绕过的ConditionChecker.CanDoSomething实施,这就是为什么我存根电话,还是我我的测试过程中运行到一个空引用异常,因为_connection成员未设置。我在这里做错了什么?

回答

1

你只标记您的方法virtual,它将工作:

public virtual bool CanDoSomething() 
{ 
} 

由于幕后犀牛模拟将创建一个动态代理为ConditionChecker,所以你需要标记virtual,让犀牛模拟重写它。

+0

谢谢,所以这个限制来自Castle.DynamicProxy,对吧? – 2013-04-22 09:39:07

+0

@ SebastianEdelmeier:正确:) – 2013-04-22 09:39:26

+0

啊!如果'ConditionChecker'的构造函数包含我想绕过的代码呢?那是不可能的,不是吗? – 2013-04-22 09:44:52