2012-01-22 193 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