2009-07-29 5 views
24

우리 팀은 엄청난 유연성과 고도로 읽기 쉬운 구문에 대한 조롱 프레임 워크로서 최근 Moq을 사용하기로 한 결정을 내 렸습니다. 우리가 처음 접했을 때 나는 단순한 질문 인 것처럼 보인다. 검색 (여기, Google 등)은 Moq의 다른 뉘앙스에 대해 많은 논의를하지만, 필자가 필자가 아는 것은 아니다. 겉보기에 관련된 몇 가지 질문이 붉은 청어로 변했습니다.Moq를 사용하는 "단락"공극 법?

우리는 외부 종속성 (정확한지는 Amazon SimpleDb 임)을 가지고 있지만 테스트가 라이브 연결이 끊어 지도록하고 싶지는 않습니다. 특정 방법

  • 는 일부 "비즈니스"논리
  • 해당되는 경우 적용 우리가 구축 한 공급자를 통해 SDB 밖으로 전화를 호출의 내가 단위로 원하는 SaveItem()

를 호출하자 우리가 필요한 컨텍스트를 설정하고 SaveItem()이 호출되었지만 실제로는 SaveItem()이 호출되지 않도록 (A) SDB 공급자가 완전히 수화되지는 않았지만 폭탄이 발생할 가능성이있는 Bock 및 B) 나는 그 거래에 대해 수백, 수천 번을 지불하고 싶지 않다.

값을 반환하는 메서드를 처리 할 때 이것은 간단했습니다. 그래도 위의 개요 경우

mockDb.Setup(d => d.GiveMeSomething()).Returns("Foo"); 

, 내 " SaveItem()"방법은 MOQ의 Returns() 방법을 사용하는 것이 무효 따라서 옵션은 사용할 수 없습니다. 그리고 내가 SaveItem()이 호출되는지 확인하기 위해 콜백을 설정할 수는 있지만, 실제로 아무 것도하지 않도록 할 수는 없습니다.

희망/나이브, 내가 생각 일 것이다 다음,하지만 여전히 메소드를 호출하기 위해 나타납니다

mockDb.Setup(d => d.SaveItem(It.IsAny<object>())); 

그래서 백만 달러짜리 질문 : 다음 가상 코드의 MOQ는 무엇입니까? SaveItem() 방법은 가상 또는 추상, 당신은 Callbase = true을 설정하지 않는 경우

mockDb.Setup(d => d.SaveItem(It.IsAny<object>())).STOP_RIGHT_HERE(); 
+0

편집 상황을 명확히하기 위해, 테스트는 "비즈니스"클래스가 아니라 실제 SimpleDB의 구현을 위해, 주위에 떠입니다. SimpleDB 구현은 다른 곳에서 테스트됩니다. 여기에 제가 조롱하는 부분이 있습니다. – bakasan

답변

29

는 다음 방법은 모의하여 아무것도하지 않는 다시 구현해야합니다.

당신은 할 수 있어야한다 :

mockDb.Setup(d => d.SaveItem(It.IsAny<object>())).Verifiable(); 

... test here ... 

mockDb.Verify(); 
+0

완벽! 확실하게 Verifiable()/Verify()에 대한 의도가 없다는 것을 전혀 알지 못했고 더 공식적인 문서가 없다면 해당 영역의 스레드와 게시물을 읽을 줄조차 모릅니다. 방금 ​​소용돌이 치다.이 시나리오에 대해 긍정적이고 부정적인 테스트 케이스가 생겼다. 감사합니다! – bakasan

+2

+1; 또한 Verificationable() 플래그에 관계없이 mockDb.VerifyAll()을 호출하여 모든 호출을 확인할 수도 있습니다. –

+0

다른 시나리오에 대해이 답변을 확장 할 수 있습니까? – leon