2008-09-16 5 views
6

현재 가장 큰 문제 중 하나는 전체 테스트를 다이빙으로 돌리고 있다는 것입니다. 필자가 작성한 코드의 상당 부분이 다른 소스의 타사 COM 객체에 크게 의존하기 때문에 서로 상호 작용하는 경향이 있습니다 (나는 당신이 알 필요가있는 경우에 몇몇 헬퍼 도서관을 사용하여 Microsoft Office를위한 추가 기능을 쓰고있다).타사 COM 개체와 상호 작용하고 인스턴스화하는 코드를 어떻게 테스트합니까?

내가 모의 객체를 사용해야한다는 것을 알고 있지만,이 경우 정확히 어떻게해야할까요? 나는 단지 기존의 객체에 대한 참조를 전달해야하지만 내 루틴 중 일부는 외부 COM 객체를 인스턴스화 한 다음 다른 라이브러리의 다른 외부 COM 객체로 전달할 때 비교적 쉽다는 것을 알 수 있습니다.

가장 좋은 방법은 무엇입니까? 내 테스트 코드에서 레지스트리의 COM 등록 정보를 임시적으로 변경해야 테스트 코드가 대신 내 모의 객체 중 하나를 인스턴스화 할 수 있습니까? 수정 된 타입 라이브러리 유닛을 주입해야합니까? 다른 접근법이 있습니까?

델파이 용 예제 또는 도구에 특히 감사하지만 더 일반적인 조언과 더 높은 수준의 설명도 마찬가지로 만족 스러울 것입니다.

감사합니다,

올리버

답변

6

좋은 소개가 있습니다. 그런 다음이 래퍼를 쉽게 조롱 할 수 있습니다.

코드의 일부가 COM 개체를 직접 인스턴스화했기 때문에 실제로 적합하지 않습니다. 이 코드를 변경할 수 있으면 factory 패턴을 사용할 수 있습니다. 팩토리를 사용하여 COM 객체를 만듭니다. 팩토리를 모의 해 다른 객체를 반환 할 수 있습니다.

래퍼를 통해 또는 원래 COM 인터페이스를 통해 개체에 액세스하는지 여부는 사용자가 결정합니다. COM 인터페이스를 조롱하기로했다면 모의의 IUnknown :: QueryInterface를 명심하십시오. 모든 인터페이스를 조롱했다는 것을 알 수 있습니다. 특히 객체가 다른 COM 객체로 전달되는 경우 더욱 그렇습니다.

또는 CoTreateAsClass 방법을 확인하십시오. 나는 그것을 사용한 적이 없지만 당신이 필요로하는 것을 할 수 있습니다.

3

그것은 '테스트 용이성을위한 설계'내려 온다. 이상적으로는 COM 객체를 직접 인스턴스화해서는 안되며 모의 객체로 대체 할 수있는 간접 계층을 통해 액세스해야합니다.

이제 COM 자체가 간접적 인 수준을 제공하고 실제 의도에 대한 대체품을 제공하는 모의 개체를 제공 할 수는 있지만 작성하는 데 어려움이있을 것이라고 생각하며 많은 도움을 받을지 의심 스럽습니다. 기존 조롱 프레임 워크.

+0

동의; COM 객체를 사용하는 모든 상호 작용 (IDispatch를 통한 자동화 호출 제외)은 COM 인터페이스를 사용하기 때문에 모의 클래스에서이를 구현할 수 있어야합니다. – rpetrich

2

단위 테스트 상황에서 실제 COM 개체가 아니라 모의 개체를로드 할 수있는 제 3 자 COM 개체 주위에 씬 랩퍼 클래스를 작성합니다. 나는 보통 mock 객체를 전달하는 두 번째 생성자를 사용하여이 작업을 수행합니다. 일반 생성자는 COM 객체를 정상적으로로드했을 것입니다.

위키 피 디아 기사는 전통적인 접근 방식은 클라이언트 코드가 COM 개체를 인스턴스화을 담당하는 래퍼를 사용하는 것을 말한다 주제 Wikipedia artible