2009-12-10 3 views
4

확실히 누군가가 내 좌절감을 덜어주기를 바랍니다. WCF 서비스 구현 클래스를 단위 테스트 할 수있는 좋은 방법을 찾으려고 노력하고 있지만 솔루션을 제공한다는 것을 알게 된 모든 리소스는 단일 메서드/작업만으로 서비스로 제한됩니다.여러 종속성이있는 WCF 서비스 단위 테스트

제 경우에는 몇 가지 서비스 메소드/연산을 포함하는 서비스 클래스가 있습니다. 서비스 클래스의 목적은 핵심 응용 프로그램 내에서 구현되는 비헤이비어에 인터페이스를 제공하는 것입니다.

  1. 가 이 작업을 수행하는 적용 명령 개체의 인스턴스를 생성하는 개체의 속성
  2. 확인하는 발신자
  3. 에서 Request 객체를 받아들이 : 위해 이와 같이, 각각의 방법/작업을 담당한다
  4. 요청 개체의 속성을 Command 개체에 매핑합니다. 명령을 실행
  5. 호출자 또한

에 대한 응답을 반환하는 응답 객체

  • 에 결과를 매핑
  • 객체 서비스 방법은 발생 및 WCF 오류를 반환 예외를 처리한다.

    우리는 IoC (DI)와 AOP 모두 Spring.NET을 사용하고 있습니다. 서비스 클래스는 Spring에 의해 인스턴스화되어 Spring의 ParameterValidation aspect를 사용하여 2 단계를 수행하게합니다. 기본적으로 3 단계에서 Spring을 사용합니다.

    대부분이 모든 것이 효과적입니다. 그러나 서비스 메소드의 동작을 확인하기위한 유닛 테스트를 작성할 때 여러 메소드 객체 (메소드 당 하나)에 대한 서비스의 종속성을 처리하는 올바른 방법을 파악하기가 어려워졌습니다.

    Command 객체를 조롱하는 데 문제가 없으며 (우리는 Moq, btw를 사용함) 문제가 없으며 블랙 박스 테스트를 수행하는 데 문제가 없음을 분명히 알겠습니다. 4 단계가 올바르게 수행되었는지 확인하거나 Command 개체가 예외를 throw하는 경우 서비스가 올바르게 처리하는지 확인하는 등 내부 논리에 대한 흰색 상자 테스트를 수행하려고합니다. 이들을 위해 Command 객체의 mock 인스턴스를 사용하고 있습니다.

    문제는 테스트 대상 개체가 여러 종속성을 갖는 시나리오에 대한 모범 사례를 찾는 것입니다. 특히 실행중인 테스트에 대해 그 중 하나에만 관심이있는 경우 특히 그렇습니다.

    DI에 대한 생성자 접근 방식은 서비스에서 메서드를 수행 할 때 생성자에 대한 인수를 많이 가질 필요가 있으므로 실용적이지 않습니다. 세터 주입은 세터가 테스트 목적으로 만 존재할 것이기 때문에 걱정스럽고, 많은 경우에 세터 주입이 많을 것이기 때문입니다.

    이 서비스는 4 단계를 기본적으로 Spring을 사용하여 Command 개체를 인스턴스화하지만 상속 및 재정의 방식을 사용하여 모의을 반환하도록 재정의되는 가상 메서드로 위임하도록 설계되었습니다. 그러나 이것은 다루기 힘든 것으로 판명되었습니다.

    그래서 다양한 솔루션을 선보이는 온라인 기사 다음에 기사를 쏟아 부은 후, 내가 말했듯이 한 가지 방법/작업으로 서비스를 반영하는 것만으로도 쉽게 구현할 수있는 방법에 대한 지침을 찾고 있습니다. 여러 메소드와 여러 종속성을 포함하는 실제 서비스를 처리 할 때 유지 보수하고 확장하십시오.

    mocked Command 객체를 삽입하기 위해 Spring을 사용할 수 없다는 것을 명심하십시오. mock을 설정하고 메소드의 동작을 검증하기 위해 mock에 대한 참조가 필요하기 때문입니다. (내 테스트가 제대로 작동하는 스프링에 의존한다는 것은 말할 것도 없습니다.)

  • +0

    마지막 공연에서 우리는 자기 호스팅 서비스에 조롱을 삽입하는 방법을 알아 냈습니다. "단위 테스트"(이 단계의 수용 테스트 더)는 테스트중인 서비스를 호출하는 경량 클라이언트를 호출했습니다. 이것이 당신의 필요에 맞는 것이라면 내가 코드를 파고 게시 할 수 있는지 알게 될 것입니다. –

    +0

    우리가 찾고있는 것보다 기능 테스트와 비슷합니다. 사실, 서비스 클래스 구현을 "단위"로 테스트하려고한다는 것을보다 분명하게 지적 했어야합니다. 이 시점에서 WCF조차 사용하지 않습니다. – SonOfPirate

    답변

    0

    당신은 이미 대부분의 힘든 일을 한 것처럼 들립니다.

    이미 DI 컨테이너를 사용하고 있기 때문에 3 단계를 가로 챌 수있는 모의 객체를 만들고 삽입 할 수 있습니다. 그런 다음 DI 컨테이너에서받은 내용과 유효성 검사를 통해 처음 두 단계를 테스트 할 수 있습니다. Mock은 남은 단계를 테스트하기를 원하는대로 되돌립니다.

    당신은 이미 spring.net에 큰 의존을하고 여분의 거리를 가라. 특정 Mock을 사용하기 위해 임시로 설정을 수정하는 방법이 있어야합니다. 만약에 당신이 당신의 모의 장소를 잡을 수 있도록 당신의 서비스에 의해 사용되는 간단한 공장을 고려하지 마십시오.

    +0

    필자는 마지막 단락을 반복했다는 것을 알고 있지만, spring.net이 테스트를 진행하고 있다면 그 문제를 해결해야합니다. – smaclell

    1

    저는 보통 내 서비스 클래스를 실제 기능에 대한 단순한 외벽으로 만들 수 있습니다. 이 경우 서비스 자체 테스트를 계속 고려할 수도 있지만 모든 호출을 여러 내부 개체 중 하나에 위임하게해야합니다. 더 구체적으로 테스트 할 수 있습니다.

    +0

    그건 본질적으로 우리가하고있는 일이지만 위임이 제대로 작동하는지 테스트하고 싶습니다. 예를 들어 내부 객체 (위임 할 객체)의 속성을 변경하면 해당 객체가 올바르게 작동하지만 더 이상 내 서비스 메소드에서 요청 객체를 올바르게 매핑하지 않게됩니다. – SonOfPirate

    관련 문제