우리 팀은 엄청난 유연성과 고도로 읽기 쉬운 구문에 대한 조롱 프레임 워크로서 최근 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();
편집 상황을 명확히하기 위해, 테스트는 "비즈니스"클래스가 아니라 실제 SimpleDB의 구현을 위해, 주위에 떠입니다. SimpleDB 구현은 다른 곳에서 테스트됩니다. 여기에 제가 조롱하는 부분이 있습니다. – bakasan