2014-11-20 2 views
2

일부 구체적인 추상 보호 메소드가있는 추상 클래스가 있으며이 추상 클래스에 대한 PHPUnit 테스트가 있습니다.PHPUnit 테스트 하위 클래스가 인터페이스를 준수합니다.

그럼 추상 클래스를 확장하고 추상 보호 된 메소드를 구현하는 클래스가 있습니다.

아이 클래스가 다른 방법으로 추상화 된 보호 된 메소드에서 반환해야하는 것을 반환하는지 테스트하는 가장 현명한 방법이 궁금합니다.

개인/보호 된 메소드를 테스트해서는 안되는 점을 많이 읽었지만, 보호 된 메소드에서 코드 커버리지를 얻기 위해 추상 클래스 테스트에서 많은 테스트를 복제해야하기 때문에이 어색함을 발견했습니다. 많은 mock 객체를 생성하고 메소드를 설정하여 특정 값을 반환합니다.

최종 결과는 다른 클래스와 매우 긴밀하게 결합 된 많은 테스트가됩니다. 클래스를 변경하면 클래스에 대한 테스트가 변경되어야합니다 (완전히 정상입니다). 그런 다음 클래스의 무수한 모의 구현도 변경해야합니다.

하루가 끝날 때 추상 클래스가 작동하면 추상 보호 메소드 구현시 예상 값을 반환하는 한 내 자식 객체도 작동한다는 것을 알게됩니다.

패턴을 간과하고 있는지 궁금합니다.

모든 하위 클래스에서 테스트를 복제하는 것은 하위 클래스가 인터페이스를 올바르게 구현하는지 테스트하는 것보다 좋지 않은 것처럼 보입니다.

+0

나는 당신이 제안한 것을 해왔고 실제로 테스트를 테스트에 포함하거나 필수 코드로 옮겼습니다. 내가 언급 한 것과 같은 이유로 추상 클래스를 테스트합니다. 방금 테스트를 수행하는 코드를 복제 할 필요가 없도록 동일한 테스트 추출을 수행했습니다. 테스트를 통해 PHP 파일을 간단히 REQUIRE() 한 다음 호출하십시오. –

+0

그게 좋습니다. 재사용 가능한 테스트를 분할하지 않는다고 생각하지 않습니다. 나는 이것이 아마도 가장 현명한 방법이라고 생각합니다. – user2045006

답변

1

패턴이 내려다 보입니다. Strategy Pattern이됩니다. 자식 객체의 보호 된 메소드는 public 메소드로 보호 된 메소드로 자체 객체로 리팩토링되어야합니다. 그런 다음 이러한 공용 메서드가 올바른 것을 반환하는지 테스트 할 수 있습니다.

기본 클래스에 대한 테스트는 모의 객체를 전달하기 위해 변경해야합니다. 하위 클래스가 기본 추상 클래스의 보호 된 메소드 만 구현하는 경우. 기본 클래스에서 추상을 제거하고 자식에게 전략 인터페이스를 구현하게 할 수 있습니다.

이렇게하면 디자인이 더욱 유연 해집니다. 다른 이유로 인해 기본 클래스를 쉽게 확장 할 수 있으며 이전 기능을 모두 사용할 수 있습니다.

+0

그건 내가 생각하고있는 것이 아니지만 정답입니다. 디자인이 좋지 않아 테스트하기가 어렵습니다. 고맙습니다. – user2045006

관련 문제