2009-04-22 2 views
4

편집 : 언어/플랫폼/닷넷비웃음이 아닌 가상 이벤트

C#을

나는 현재 내 현재 프로젝트에 광대 한 단위 테스트의 공허함을 채우기 위해 노력하고, 틀림없이 새로운 것을하고 있습니다 TDD에게, 좀 더 비즈니스 크리티컬 한 기능을 테스트하는 방법에 대해서는 상당히 혼란 스럽습니다.

나는 Moq를 선택하고 간단한 mock을하기에 충분한 시간을 보냈지 만, 응용 프로그램의 핵심에는 Unit Test를 적절하게 개념화하는 데 어려움을 겪고있는 상당히 크고 무서운 COM interop 계층이 있습니다. COM 구성 요소는 전적으로 타사이므로 수정할 수 없으며 전화 통화를 처리 할 수있는 유한 상태 시스템에 해당하는 요소를 구현합니다. 이 구성 요소는 비 가상 이벤트 세트를 통해 내 응용 프로그램에 알립니다.이 응용 프로그램은 상태 변경을 시뮬레이트하기 위해 특정 주문에서 테스트하고 싶지만 Moq은 가상 이벤트 이외의 다른 작업을 수행하는 방법을 제공하지 않습니다.

지식이 풍부한 TDDers/Mockists에게 묻는 질문은 다음과 같습니다. 이런 종류의 테스트는 어떻게 진행합니까?

분명히 TypeMock이 이것을 지원합니다 (자체적 인 단점이 있습니다).하지만 타입 안전성에 대한 여러 가지 이유와 내 뒤에서 뚜렷한 일을하는 일반적인 느낌으로 사용하지는 않을 것입니다.

답변

4

TypeMock과 같은 무언가를 사용하지 않는 한 가상/추상적 메서드 만 조롱 할 수 있습니다.

제어권이없는 코드를 테스트해야하는 경우 해당 코드에 대한 종속성을 깨야합니다. 테스트 할 수없는 클래스의 메서드, 속성 및 이벤트가있는 Facade를 만듭니다. 당신이 실제로 사용하는 것들을 고수하십시오; 그것은 작성해야하는 코드의 크기를 계속 유지합니다. 자신이 관리하지 않는 코드가 아닌 자신이 제어하는 ​​정면을 기준으로 코드를 작성하십시오.

마지막으로 몇 가지 기술 중 하나를 사용하여 시험 중에 모의을 대체 할 수있는 정면에 액세스 할 수 있습니다. 설정 파일, 의존성 삽입 프레임 워크, 지연 인스턴스화 (lazy instantiation) 등을 사용할 수 있습니다.이 방법을 사용하면 정면을 조롱하고 유닛 테스트에 사용할 수 있습니다. 물론, 실제 COM interop 클래스로 파사드가 올바르게 작동하는지 확인하기 위해 일부 통합 테스트를 수행해야합니다.

영감을 얻으려면 System.Web.Abstractions를 살펴보십시오. 이 클래스에는 ASP.NET 핵심 클래스를 래핑하여 여러 종류의 클래스가 포함되어 있습니다.

+0

정말 잘 응답 해 주셔서 감사합니다.하지만 여전히 COM 구성 요소와 추상화의 일부 레이어 사이에 테스트 할 수없는 상호 작용이있을 것이라는 점에서 문제의 핵심으로 이어지고 있습니다. 어쩌면 TDD 철학에 대한 나의 이해는 근본적으로 결함이 있습니다 ... – TheMissingLINQ

+1

Nope. 너는 꽤 옳아. 그러나 다시, 완벽한 것은 없습니다. – Will