测试模拟对象犀牛嘲笑

时间:2012-01-22 16:59:00

标签: nunit rhino-mocks

我是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呢?有人可以帮忙??

2 个答案:

答案 0 :(得分:4)

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

你可以做两件事

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

    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();
        }
    }
    

答案 1 :(得分:1)

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

<强>更新

这是一种方法:

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>();