【问题标题】:assistance with testing abstract method with rhino mocks协助使用 rhino mocks 测试抽象方法
【发布时间】:2011-12-10 22:42:06
【问题描述】:

我正在为我的 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 并使用 rhino 模拟来模拟。我想为Execute 方法编写测试来测试它是否按我的预期工作。

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

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

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

【问题讨论】:

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


    【解决方案1】:

    如果您需要模拟该方法,则该行为可能已经足够复杂以至于您无法直接对其进行测试。

    因此,请考虑将该行为委托给协作类,然后完全模拟该类。

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

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

    【讨论】:

      【解决方案2】:

      您必须将基类方法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();
      

      【讨论】:

      • 非常感谢,非常有帮助。 “重定向”方法是否在 BaseClass 中受到保护,是否仍然可以通过向其添加虚拟来模拟它?还是这只适用于公共方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多