使用Rhino存根限制UnitTest的范围

本文关键字:UnitTest 范围 Rhino 存根 使用 | 更新日期: 2023-09-27 18:10:14

我正在做一个服务方法的单元测试,它有依赖关系。简化:

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成员没有设置。我哪里做错了?

使用Rhino存根限制UnitTest的范围

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

public virtual bool CanDoSomething()
{
}

由于Rhino Mock将在后台为ConditionChecker创建一个动态代理,因此您需要标记virtual以允许Rhino Mock覆盖它。