2010-05-05 2 views
1

NUnit과 Moq을 사용하여 리팩토링을 너무 많이하기 전에 레거시 코드에 대한 테스트를 마무리하려고합니다. 내가 멈추라 고 말할 때까지 메서드가 루핑을 계속하는지 테스트 할 필요가있다. 여기에 내 생각입니다.특정 값을 특정 횟수만큼 반환하도록 Moq를 설정하는 좋은 방법입니까?

[TestCase] 
public void KeepsCallingDoSomethingUntilShouldIKeepGoingIsFalse() 
{ 
    var dal = new Mock<IDataAccessLayer>(); 
    var sut = new MyService(dal.Object); 
    int numberOfTimesToReturnTrue = 5; 
    dal.Setup(x => x.ShouldIKeepGoing()) 
     .Callback(() => numberOfTimesToReturnTrue--) 
     .Returns(() => numberOfTimesToReturnTrue >= 0); 

    sut.Blah(); 

    dal.Verify(x => x.DoSomething(), Times.Exactly(5)); 
} 

이 테스트를 이해하기 어렵습니까? 이 작업을 수행하는 데 유효한/깨끗한 방법입니까? 더 좋은 방법이 있습니까? 이 방법으로 테스트를 작성하면 뭔가 저를 괴롭 힙니다.

답변

1

는 내가 같은 것을 할 것이라고 생각 :

const int max = 5; 
var callCount = 0; 
_dal.Setup(x => x.ShouldIKeepGoing()) 
    .Returns(()=> ++callCount <= max) 
    .AtMost(max+1); 

코뿔소 모의 객체는 다음 순서로 각각 예상 호출을 기록 통화의 시리즈를 재생하는 기능이있다.

+0

MoM 3.1.416에서 AtMost 호출을 그렇게 할 수없는 것 같습니다. 이 4.0 베타 버전입니까? 하지만 내 확인에서 시간을 지정해야한다고해도 콜백이 없으면 더 깨끗하다고 ​​생각합니다. 감사합니다. – JohnRudolfLewis

+0

4.0.812.4를 사용 중입니다. – Mark

관련 문제