2010-08-19 4 views
5

(C 번호, WCF 서비스, 코뿔소 모의 객체, MbUnit에)비웃음

나는 그래 난 주위의 잘못된 방법을 알고 있지만 그 내 현재의 계약에 나가 일을하는 방법은 (이미 코드에 대한 테스트를 작성되었다). 나는 조롱을 지원하기 위해 상당한 의존성을 주입하고 추가 인터페이스를 추가하는 등 꽤 많은 부분을 재조정했다.이 모두가 디자인을 개선했다. 일반적으로 필자의 테스트 경험은 잘되고있다 (취약성이 드러나고 디커플링이 개선되었다). 어떤 객체에 대해서도 종속 모의 객체를 만들었으며 이것은 나와 잘 어울리 며 의미가 있습니다.

앱의 본질적으로 4 개의 물리적 레이어가 있습니다. 데이터베이스, 데이터 액세스를위한 리포지토리 계층, 관리 (또는 비즈니스 논리) 계층을 통해 리포지토리에 연결되는 WCF 서비스로 맨 아래에 표시됩니다.

WCF 관리자 저장소 데이터베이스

테스트 매니저 및 저장소 층 Rhino를 모의 객체와 의존성 조롱과 같은 테스트 대상 레이어로 주입 충분히 간단하고있다.

제 문제는 상위 WCF 레이어를 테스트하는 것입니다. 내 서비스에는 의존성을 주입 할 수있는 생성자가 없으므로 서비스에서 공용 메서드 (ServiceContracts)를 테스트 할 때 종속성을 조롱하는 방법을 알지 못합니다.

저는 그것이 의미가 있었기를 바랍니다. 나는 TypeMockIsolator 등을 알고 있지만, 예산 및 기타 이유로이 경로를 따라 가고 싶지 않습니다. 여기서는 다루지 않을 것입니다. 게다가 내가 필요로하는 정보를 가지고있는 영리한 '스태커 (Stackers)'가 많을 것이라고 확신한다.

미리 감사드립니다.

답변

2

당신이 당신의 서비스에 생성자가 못할 특별한 이유가 있나요 -

RhinoMock 윈저와 함께 작업을 수행하는 방법에 대한 좋은 자습서

는,이 블로그 기사를 살펴?

그렇지 않은 경우 기본값을 연결하는 기본 생성자와 종속성을 가진 매개 변수화 된 생성자가있는 오버로드 된 생성자를 가질 수 있습니다. 이제 매개 변수화 된 ctor를 테스트하고 프로덕션에서 인스턴스를 작성하는 데 기본 ctor를 사용할 수 있습니다.

public MyService() : this(new DefaultDep1(), new DefaultDep2()) 
{ 
} 

public MyService(IDep1 d1, IDep2 d2) 
{ 
} 

당신이 주입 지점을 통해 필요한 종속성을 서비스 인스턴스를 생성하고 제공하기 위해 WCF IInstanceProvider interface을 사용하는 것입니다 의존성 주입을 사용하는 경우 더 나은 솔루션을 제공합니다. Structure Map을 사용하는 예제는 here입니다.

+0

내가 내려야 할 경로와 같은 소리가납니다. 링크를 주셔서 감사합니다 .. 매우 유용합니다. –

+0

도와 주셔서 감사합니다. 일부 답변은 비슷했지만 간결하고 문제에 대한 직접적인 해결책을 제시하므로이 답변을 선택했습니다. 다시 한번 고마워. –

0

WCF 서비스를 '관리자'보다 얇게 만들 수 있으므로 테스트가 필요한 로직이 거의 없거나 전혀 없습니다. 그런 다음 테스트하지 않고 관리자를 테스트하십시오. 또는 테스트 할 수있는 서비스의 로직을 포함하는 또 다른 '서비스'레이어를 사용하여 실제 WCF 코드를 통과 시켜도 비슷한 효과를 얻을 수 있습니다.

+0

좋아 .. 그 덕분 .. 나는 비슷한 것을하고 있다고 생각했지만 레이어를 도입하는 것을 피하려고했다. 하지만 가능성으로 확인해 주셔서 감사합니다. –

0

우리의 WCF 서비스는 모든 종속성을 Factory 객체에서 가져오고, IFactory를 사용하는 생성자를 서비스에 제공합니다. 따라서 IDependency와 같은 종속성 중 하나를 조롱하는 테스트를 작성하려면 모의 된 IDependency 객체를 다시 서비스에 제공하도록 프로그래밍 된 모의 팩토리 만 삽입하면됩니다.

+0

제가 테스트를 위해 구성 할 수 있도록 두 번째 생성자를 효과적으로 도입하고 있다고 말하는 것이 맞습니까? 내가 동의하지 않는다는 것을 말하면서, 나는 단지 그것을 이해할 수 있도록한다. –

+0

네, 저는 그것이 훌륭하다는 것을 말하는 것이 아닙니다. 우리가 사용하는 것만 큼 괜찮습니다. –

+0

필자는이 방법을 사용하여 기존 코드를 테스트 할 수 있도록했습니다. 약간 못 생겼지 만 효과적이다. –

0

Unity, AutoFac 또는 Castle Windsor와 같은 Inversion of Control (IoC)과 조롱 프레임 워크 (예 : Moq, NMock, RhinoMocks)를 사용하는 경우 올바른 디자인을 갖춘 한 간단합니다. http://ayende.com/Blog/archive/2007/02/10/WCF-Mocking-and-IoC-Oh-MY.aspx

+0

안녕하세요. 기사를 읽은 것을 읽어 주셔서 감사합니다. (글을 읽으세요.)하지만 제가 생각하기에는 그게 아니라고 생각합니다. 이 기사에서는 서비스 조롱에 대해 언급합니다. 나는 그것을 조롱하고 싶지 않다. 나는 그것을 테스트하고 싶지만, 내가 주입 할 수없는 모의이 필요한 의존성을 가지고있다. (내가 놓친 것이 아니면 제외) –

0

Castle Windsor을 사용하는 경우 WCF facility에서 기본이 아닌 생성자를 사용하고 서비스에 종속성을 주입 할 수 있습니다.

+0

나는 아니야.하지만 나는 그것을보아야한다는 느낌을 받고있다. :). 팁 고마워. –

관련 문제