2010-03-05 4 views
1

저는 Moq을 사용하여 몇 가지 테스트를 진행했지만 try catch 블록을 통해 두 번 호출하려는 메소드를 테스트하는 데 어려움이있었습니다. 원칙은 첫 번째 호출이 예외를 throw 한 다음 catch에서 문제를 해결하고 메서드를 다시 호출한다는 것입니다.Moch와 Rhino Mock을 비교해보십시오.

다음과 같이 Rhino Mocks로 관리했지만 두 프레임 워크에 익숙하지 않아 Moq를 사용하여 동일한 결과를 얻을 수 있는지 알려주는지 궁금했습니다.

// C.U.T 
public class Mockee 
{ 
    bool theCatLives = true; 

    public Mockee() { } 

    public virtual void SetFalse() 
    { 
     theCatLives = false; 
    } 
} 


[Test] 
public void TestTryCatch(){ 

    var mr = new MockRepository(); 
    var mock = mr.StrictMock<Mockee>(); 
    mr.Record(); 
    Expect.Call(mock.SetFalse).Throw(new Exception()); 
    Expect.Call(mock.SetFalse); 
    mr.ReplayAll(); 

    try 
    { 
     mock.SetFalse(); 
    } 
    catch 
    { 
     mock.SetFalse(); 
    } 

    mock.VerifyAllExpectations(); 
} 

답변

2

이것은 주문한 기대에 대한 개념이 없기 때문에 Moq과 특히 쉬운 것은 아닙니다. 당신은, 그러나, 콜백 방법을 사용하여 다음과 같이 거기에서 예외를 던질 수 :

var actions = new Queue<Action>(new Action[] 
{ 
    () => { throw new Exception(); }, 
    () => { } 
}); 

var mock = new Mock<Mockee>(); 
mock.Setup(m => m.SetFalse()).Callback(() => actions.Dequeue()()).Verifiable(); 

try 
{ 
    mock.Object.SetFalse(); 
} 
catch 
{ 
    mock.Object.SetFalse(); 
} 
mock.Verify(); 

그러나 한 가지주의가 SetFalse 방법 모두에서 호출되었는지 여부를이 버전은 검사 점이다. 당신이 두 번 같은 설정을 진술 할 것이기 때문에

mock.Verify(m => m.SetFalse(), Times.Exactly(2)); 

그러나이 약간 DRY 원칙을 위반하지만 : 당신은이 두 번 호출되었는지 확인하려면

, 당신은이에 마지막 문을 변경할 수 있습니다 먼저 Expression<Action<Mockee>> 변수를 선언하고 정의하여 SetupVerify 메서드에 모두 사용할 수 있습니다 ...

+0

감사합니다. 저는 CallBack()으로 아직 연주하지 않았으며 재미 있습니다! – Grokodile

관련 문제