2010-11-27 6 views
2

타사 구성 요소에 속한 개체를 뱉어내는 클래스에서 TDD를 사용하려고합니다. 그러나 그 분명히에 조금 혼란 점점 오전 :타사 구성 요소 (TDD 포함)

는 개체를 분리하여 테스트해야) 단위 테스트와 함께

b)는 타사 구성 요소가

가 수행 어댑터에 랩해야 이러한 규칙은 때 적용 써드 파티 컴포넌트에 속한 객체의 인스턴스를 반환하는 코드에 대한 테스트 작성 예를 들어, 여기에 지금까지 테스트는 다음과 같습니다

// Arrange 
string foodXml = "<food><ingredient>Cabbages</ingredient>" + 
       "<ingredient>Bananas</ingredient></food>"; 
IFoodMixer mixer = new FoodMixer(); 

// Act 

// Smoothie is the third-party component object 
Smoothie urgh = mixer.Mix(foodXml); 

// Assert 

Assert.AreEquals("Cabbages", urgh.Ingredients[0].Name); 
Assert.AreEquals("Bananas", urgh.Ingredients[1].Name); 

사과이 질문은 (개념은 위의 약간을 보이는 경우 또는 바보!) 약간의 기본적인 보인다 경우 - 다만 두 가지 규칙 위의 적용 할 수있는 방법을 이해하는 데 어려움을 겪고 있어요 이러한 상황에서.

미리 조언 해 주셔서 감사합니다!

답변

4

실용적입니다. 스무디가 단지 데이터 객체 일 경우, 그것을 포장하는 것을 귀찮게하지 마십시오.

처음에는 스무디를 만드는 FoodMixer 안에 뭔가가 있습니다. 만약 그것이 제 3 자 컴포넌트라면, 필자는 그것을 마무리 할 것이다 (클래스에서 정적 메소드로 위임 할 수있다). 그런 다음 의존성 - 래퍼를 삽입하고 유닛 테스트에서 조롱한다.

귀하의 단위 테스트는 SmoothieMaker (제 3 자이든 아니든)와 관계없이 FoodMixer의 행동 및 책임을 설명합니다. FoodMixer의 책임 중 하나는 SmoothieMaker에게 실제로 스무디를 만드는 것이 아니라 스무디를 요청하는 것입니다. 그것을 조롱함으로써 우리는 그 책임과 계급 범위를 표현할 수 있습니다.

귀하의 스무디가 데이터 객체 일뿐만 아니라 풍부한 동작을하는 경우, 랩된 스무디 메이커 내에서 스무디를 포장합니다.

이제 타사 라이브러리와 완벽하게 분리되므로 유용한 부산물로 쉽게 단위 테스트를 수행 할 수 있습니다.

+0

신속하고 자세한 답변을 보내 주셔서 감사합니다. 문제는 스무디 객체가 상당히 복잡하고 FoodMixer가 많은 기능 (Excel 파일 생성을위한 NPOI btw)을 사용하는 것입니다. 아직 포장해야합니까? 그것의 많은 것을 다시 쓰는 것을 포함 할 것 같은 느낌. –

+0

이 경우 나는 당신이 달성하고자하는 것을 해결할 것이고, 그런 것들을하는 래퍼를 추가하고 그 안에 NPOI를 넣을 것이다. 일대일 대표단 일 필요는 없습니다. 검사로 테스트하기에 충분히 단순하거나 래퍼를 수동으로 테스트하고 변경할 필요가 없다면 래퍼 자체를 단위 테스트 할 필요가 없습니다 (단위 테스트는 테스트에 관한 것이 아니므로 쉽게 변경). – Lunivore

+0

나는 귀하의 답변에 깊은 감사를 드리며 NPOI 용 어댑터를 사용하는 것이 올바른 접근 방법이 될 것입니다. XML이 궁극적으로 NPOI 개체의 많은 특성을 요점으로 지정한다면 엄청난 노력이 필요한 것 같습니다. 여기서 그것은 거의 그것의 연재 된 표현이 될 것이다. 따라서 먼저 객체의 인스턴스를 반환하고 테스트에서 속성을 확인한 다음 가능한 경우 작성/어댑터로 대체하십시오. –

-1

자동으로 모의 객체를 만들고 어댑터를 사용하는 대신 어설 션을 확인하는 간단한 방법으로 mockito를 살펴보십시오. 또한 좋은 TDD 튜토리얼 인 mockito (및 JMocks)에 대한 많은 유용한 자습서가 있습니다.

+0

다른 제 3 자 클래스에 대해 어댑터를 작성해야합니다 (예 : 정적 메소드가있는 경우). 다른 클래스가 개인적으로 작성한 어댑터 등 - 그렇지 않은 경우에는이를 조롱 할 수 없습니다.또한 작가는이 C#에 태그를 추가했으며 Mockito와 JMock은 모두 Java 라이브러리입니다 (C# 용 Moq 사용)! – Lunivore

+0

mmmh, 네, Java에 대한 답은 사실이지만 모의 객체가있는 어댑터는 필요 없습니다. 나는 같은 것을 가정했다. – Uberto

+0

Fraid. .NET 용 CgLib 없음 - 모든 메소드는 인터페이스 또는 가상 (가상 메소드를 제외하고 .NET에서 클래스를 모의조차 할 수 없음)이어야합니다. 또한 조롱은 실제로 요점이 아닙니다. 제 3 자 라이브러리와의 분리입니다. API에 갇혀 있다면 효율적으로 처리하지 못합니다. – Lunivore