타사 COM 개체와 상호 작용하고 인스턴스화하는 단위 테스트 코드는 어떻게 수행합니까?

StackOverflow https://stackoverflow.com/questions/70482

문제

현재 제가 단위 테스트에 전념하는 것을 방해하는 가장 큰 문제 중 하나는 제가 작성하는 코드의 상당 부분이 서로 상호 작용하는 경향이 있는 다양한 소스의 타사 COM 개체에 크게 의존한다는 것입니다. 필요한 경우 여러 도우미 라이브러리를 사용하여 Microsoft Office용 추가 기능을 작성하고 있습니다.)

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

여기서 가장 좋은 방법은 무엇입니까?테스트 코드가 레지스트리의 COM 등록 정보를 일시적으로 변경하여 테스트된 코드가 대신 내 모의 개체 중 하나를 인스턴스화하도록 해야 합니까?수정된 유형 라이브러리 단위를 삽입해야 합니까?다른 접근 방식에는 어떤 것이 있나요?

Delphi의 예제나 도구에 특히 감사하지만 보다 일반적인 조언과 더 높은 수준의 설명에도 만족할 것입니다.

감사해요,

올리버

도움이 되었습니까?

해결책

전통적인 접근 방식에서는 클라이언트 코드가 COM 개체 인스턴스화를 담당하는 래퍼를 사용해야 한다고 말합니다.그러면 이 래퍼를 쉽게 조롱할 수 있습니다.

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

래퍼를 통해 개체에 액세스할지 아니면 원래 COM 인터페이스를 통해 개체에 액세스할지 여부는 사용자에게 달려 있습니다.COM 인터페이스를 모의하기로 선택한 경우 모의에서 IUnknown::QueryInterface를 계측해야 합니다. 그러면 특히 개체가 다른 COM 개체에 전달되는 경우 모든 인터페이스를 모의했다는 것을 알 수 있습니다.

또는 다음을 확인하세요. CoTreatAsClass 방법.나는 그것을 사용해 본 적이 없지만 당신이 필요로 하는 것을 할 수 있을 것입니다.

다른 팁

그것은 '테스트 가능성을 위한 설계'로 귀결됩니다.이상적으로는 이러한 COM 개체를 직접 인스턴스화하지 말고 모의 개체로 대체할 수 있는 간접 계층을 통해 액세스해야 합니다.

이제 COM 자체는 간접적인 수준을 제공하며 실제 개체에 대한 대체물을 제공하는 모의 개체를 제공할 수 있지만 만드는 것이 어려울 것이라고 생각하며 기존 모의 프레임워크에서 많은 도움을 얻을 수 있을지 의문입니다. .

나는 단위 테스트 상황에서 실제 COM 개체가 아닌 모의 개체를 로드할 수 있는 기능을 갖춘 타사 COM 개체 주위에 얇은 래퍼 클래스를 작성합니다.나는 일반적으로 모의 객체를 전달하는 두 번째 생성자를 가짐으로써 이를 수행합니다.일반 생성자는 정상적으로 COM 개체를 로드했을 것입니다.

Wikipedia 기사에는 주제에 대한 좋은 소개가 있습니다.위키피디아

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top