2012-01-22 157 views
2

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

回答

3

犀牛模拟当你调用MockRepository.Generate ***方法创建代理类。这意味着它延伸您的类型。如果你没有声明任何抽象,你就不能在任何模拟框架中进行任何派生。

你可以做两件事情

  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

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

更新:

下面是做这件事:

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

拇指s up :-)忘了make methodA虚拟。你能说出C#中的虚拟内涵究竟是什么? –

+0

这意味着它可以在派生类中重写。请参阅http://msdn.microsoft.com/en-us/library/9fkccyh4%28v=vs.100%29.aspx – TrueWill

+0

我有点恼火 - 我发布代码示例5分钟前@oleksii(和基本在那之前回答得好),但他的回答被接受了。请重新考虑。 – TrueWill