帮助测试使用rhino mocks的抽象方法

时间:2011-12-10 22:42:07

标签: c# unit-testing testing tdd rhino-mocks

我希望为我的c#类编写一些单元测试。我有一个名为BaseClass的基类,它有一个名为Execute的抽象方法,还有一个名为Redirect的方法。我有一个名为Class1的类,它继承BaseClass并实现抽象的Execute方法,即我想测试的方法。以下代码进一步说明了设置:

public abstract class BaseClass
{
    public abstract void Execute();

    public void Redirect()
    {
        // redirect code here
    }
}

public class Class1 : BaseClass
{
    public void Execute()
    {
      // do some processing

      this.Redirect();
    }
}

我正在使用mstest并使用犀牛嘲笑进行嘲弄。我想编写Execute方法的测试来测试它是否正常工作。

从上面可以看出,Execute方法调用了基本方法Redirect,所以我期望调用Redirect方法。

我使用Rhino mocks mockrepository来创建Class1的部分模拟。创建的模拟包含Execute方法,该方法很棒,但不包含对Redirect方法的引用,该方法位于Class1中。我希望能够在模拟的存储库上设置一个期望Redirect方法被调用。

有关如何使用rhino mocks创建测试以实现我所概述的任何提示或建议吗?

2 个答案:

答案 0 :(得分:2)

如果您需要模拟该方法,则行为可能很复杂,您无法直接测试它。

出于这个原因,请考虑将该行为委托给合作课程,然后完全嘲笑该课程。

例如,如果execute方法将实体保存到数据库,我将创建一个存储库,依赖注入 - 通过构造函数注入该存储库,然后要求存储库保存我的实体。然后可以使用标准技术模拟整个协作类。

目前,您的班级似乎对此负责太多,这就是您遇到问题的原因。当Mocks用于表达协作时,它们可以非常有效地工作,这使我们能够创建具有单一职责的类,这使我们能够创建设计良好,可维护的代码。我推荐Steve Freeman and Nat Pryce's book on the subject

答案 1 :(得分:1)

您必须将基类方法Redirect()声明为virtual,以便Rhino Mocks可以模拟它。以下对我有用:

public abstract class BaseClass
{
    public abstract void Execute();

    public virtual void Redirect()
    {
        // redirect code here
    }
}

public class Class1 : BaseClass
{
    public override void Execute()
    {
        // do some processing

        this.Redirect();
    }
}

..
var class1Mock = Rhino.Mocks.MockRepository.GeneratePartialMock<Class1>();

class1Mock.Expect(x => x.Redirect());
class1Mock.Execute();
class1Mock.VerifyAllExpectations();