2009-09-08 4 views
0

간단한 프로그램 (장난감 게임)을위한 로직을 작성하기 시작했습니다. 선박 + 모듈 인 특정 선박 (설정이라고 함)이 있습니다. 우주선을 기반으로하는 빈 설정으로 시작한 다음 해당 설정에 모듈을 추가합니다. 선박에는 번호가 매겨진 모듈 위치 배열이 있습니다.TDD : 테스트 상태에 메서드 추가하기

var setup = new Setup(ship); // ship is a stub (IShip) defined someplace else 
var module = new Mock<IModule>().Object; 
setup.AddModule(module, 1); // 1 = which position 

따라서 내 테스트 방법의 코드입니다. 이제이 코드에 대해 주장해야합니다. 글쎄, 게터 방법이 필요해?

Assert.AreEqual(module, setup.GetModule(1)); 

정말 바보 들릴지 나는 아무것도 걱정 해요,하지만 바보 같은 이유로 난 그냥 테스트가 통과 주장하는 방법을 추가로 걱정.

TDM이 실제로 추진하고있는 설계 프로세스의 일부분입니까? 예를 들면 을 알고 있습니다. 테스트하고 싶기 때문에 AddModule 메서드가 필요합니다. 테스트하기 위해 GetModule 메서드가 필요하다는 사실은 단순히 TDD를 통해 내 디자인이 진화 한 것입니다.

내 코드에서 GetModule이 실제로 필요한지 알 수 없기 때문에 이런 종류의 냄새가 나나요?이 코드는 테스트에서만 사용됩니다.

예를 들어, 모듈을 추가하면 궁극적으로 다른 설정 (갑옷, 방패, 화력 등)에 영향을 미칩니다. 것은 복잡하게 될 것이고 간단한 테스트부터 시작하고 싶습니다. 그러나 궁극적으로, 그것들은 제가 관심있는 공공의 속성입니다 - 설정은 모듈의 목록이 아니라 그것의 통계에 의해 정의됩니다.

답변

2

흥미로운 질문입니다. 먼저 테스트를 쓰는 걸 듣게되어 기쁩니다.

테스트를 통해 디자인이 명백 해지면 필요한 부품 만 만들 가능성이 큽니다. 그러나 이것이 최고의 디자인입니까? 어쩌면 아닙니다,하지만 그게 당신을 방해하지 못하게하십시오 - 귀하의 추가 방법이 효과가 있습니다!

나중에 GetModule 메서드가 필요한지 여부를 판단하기에는 너무 이르다 수 있습니다. 지금 당장은 필요한 기능을 구축하고 녹색으로 이동 한 다음 천천히 리팩토링 (빨간색에서 녹색으로 다시 이동)하여 원하는 디자인을 얻으십시오.

+0

모듈을 추가하는 경우 반드시 그 모듈을 가져와야합니다. –

0

테스트 용으로 만 사용되는 클래스에 공용 메서드를 도입 할 때는주의해야합니다.

이이 테스트를 수있는 방법을 여러 가지 방법은 다음과 같습니다

반사는 다음 GetModule 방법은 (당신의 '통계'개인 경우이 또한 일할 수) 클래스의 private 메소드이며, 당신은 그것을 액세스 할 수 있습니다 리플렉션을 통해 테스트 방법에서. 이것은 잘 작동하지만 유일한 문제는 개인 메소드의 이름을 변경하거나 일부 변수를 추가하거나 삭제할 때 컴파일러 오류가 발생하지 않는다는 것입니다. (물론 테스트가 실패하고 조기에 알게 될 것입니다)

상속 : GetModule 메서드는 보호 될 수 있으며 (상속 만 표시됨) 테스트 클래스는 기본 클래스에서 상속받을 수 있습니다. 이렇게하면 테스트 클래스가이 메서드에 액세스 할 수 있지만 실제로 외부 세계에 노출되지는 않습니다.

부작용을 주장하십시오 : 이것은 모듈을 시스템에 추가하는 것이 무엇을 의미하는지 실제로 생각하는 곳입니다. 만약 당신이 그것을 넣을 때 어떤 '통계'에 영향을 줄 것이라면, 통계가 적절하게 수정되었다고 주장하는 테스트를 작성할 수 있습니다.

+0

또는 내부 메서드를 테스트 할 수 있도록 InternalsVisibleTo 특성을 추가 할 수 있습니다. – bryanbcook

1

디자인을 진화시키는 부분은 간단한 방법처럼 아기 단계부터 시작하여 충분히 지원 될 때 복잡한 통계 (결국이 방법을 삭제하고 테스트를 변경)로 성장하는 것입니다. TDD를 할 때, 당신이 작성한 첫 번째 테스트가 이상적인 인터페이스를 목표로한다고 기대하지 마십시오. 디자인을 진화시킬 때 어떤 지저분한 것들이 떨어지는 것은 괜찮습니다.

즉, 메서드에 대한 공개 목적이 없다면 테스트 코드에 대해 가능한 한 가시성을 제한하십시오. 시스템의 나머지 부분을 빌드하고 set 메소드의 부작용으로 테스트 할 수있는 무언가를 갖게되면 결국은 사라집니다.