【问题标题】:Testing mocked objects rhino mocks测试模拟对象 rhino mocks
【发布时间】:2012-01-22 16:59:00
【问题描述】:

我是 RhinoMocks 的新手,我正在尝试编写一个如图所示的测试 我有这样的课程

public class A
{
    public void methodA(){}
}
public class B
{
    public void methodB(A a)
    {
      a.methodA();
    }
}

我正在尝试像这样测试它

A a = MockRepository.GenerateMock<A>();
public void ShouldTest()
{
    B b = new B();
    b.methodB(a);
    a.AssertWasCalled(x=>x.methodA());
    a.VerifyAllExpectations();
}

但它给出了如下所示的错误: System.InvalidOperationException : 没有设置要验证的期望,确保操作中的方法调用是虚拟 (C#) / 可覆盖 (VB.Net) 方法调用。

那我该如何测试methodB呢??有人可以帮忙吗??

【问题讨论】:

    标签: nunit rhino-mocks


    【解决方案1】:

    Rhino mock 在你调用MockRepository.Generate *** 方法时创建代理类。这意味着它扩展您的类型。如果您不声明任何抽象,则无法进行任何模拟框架中必不可少的任何推导。

    你可以做两件事

    1. 创建界面(更好的设计)
    2. 使成员虚拟(这将允许 RhinoMocks 从您的类型派生并为虚拟成员创建代理

    示例代码

    public interface IA { void methodA();}
    public class A:IA{public void methodA() { }}
    public class B
    {
        public void methodB(IA a)
        {
            a.methodA();
        }
    }
    
    [TestFixture]
    public class Bar
    {
        [Test]
        public void BarTest()
        {
            //Arrange
            var repo = MockRepository.GenerateMock<IA>();
    
            //Act
            B b = new B();
            b.methodB(repo);
    
            //Assert
            repo.AssertWasCalled(a => a.methodA());
            repo.VerifyAllExpectations();
        }
    }
    

    【讨论】:

      【解决方案2】:

      你有没有虚方法和接口的具体类。你不能嘲笑任何东西。

      更新:

      这是一种方法:

      public interface IA
      {
          void methodA();
      }
      
      public class A : IA
      {
          public void methodA(){}
      }
      public class B
      {
          public void methodB(IA a)
          {
            a.methodA();
          }
      }
      

      然后使用

      IA a = MockRepository.GenerateMock<IA>();
      

      【讨论】:

      • 竖起大拇指 :-) 忘记将 methodA 设为虚拟。你能准确说出虚拟在 C# 中的含义吗?
      • 这意味着它可以在派生类中被覆盖。见msdn.microsoft.com/en-us/library/9fkccyh4%28v=vs.100%29.aspx
      • 我有点恼火 - 我在@oleksii 前 5 分钟发布了代码示例(以及在那之前的基本答案),但他的回答被接受了。请重新考虑。
      • 感谢您的回答,威尔,我只是喜欢其他人解释答案的方式,所以接受了它,您的回答非常好。
      • @TrueWill 我在有答案之前就开始写答案了,但是当我完成时,已经有了一个(当时没有代码示例,所以我仍然发布了我的)。无论如何,您的回答很好,所以+1。
      猜你喜欢
      • 1970-01-01
      • 2011-12-11
      • 2011-07-13
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多