내 시나리오는 다음과 같습니다.
코드 중복을 줄이기 위해 추상 클래스를 만들고이 클래스를 확장하는 구체적인 클래스에 의해 구현되도록 일부 메서드를 적용했습니다.
추상 클래스 BaseClass { 보호 된 $ arrayField; ... public function getModifiedArrayField ($ constraints) { // $ arrayField에 작업을 수행하고 // arrayField의 수정 된 버전을 반환합니다 . // $ constraints 에만 의존 하며 일부`array_ *`함수 는 $ modifiedArray를 반환합니다. } // ... 코드 중복을 줄이기위한 다른 메서드 // ... 구현해야하는 추상 메서드 }
추상 클래스 자체에서 구체적인 메서드를 테스트하는 것이 좋은 생각이라고 생각했습니다.
는 $arrayField
콘크리트 클래스의 추상적 인 방법으로 채워집니다.
해당 속성을 수정하지만 변경하지는 않는 메서드의 기능을 테스트하고 싶었 기 때문에 다음과 같이 단위 테스트를 작성했습니다.
class BaseClassTest 범위 PHPUnit_Framework_TestCase private $ sut; public function setUp () { $ mockObj = $ this-> getMockFromAbstractClass (BaseClass :: class); $ ref = 새로운 ReflectionClass ($ mockObj); $ ref_prop = $ ref-> getProperty ( 'arrayField'); $ ref_prop-> setAccessible (true); $ ref_prop-> setValue ($ mockObj, [an_array]); $ this-> sut = $ mockObj; } // .. 추상 클래스의 메서드를 테스트하는 일부 테스트 메서드 public function testGetModifiedArrayFieldReturnsExpectedArray () { $ expected = [array_i_expect]; $ actual = $ this-> sut-> getModifiedArrayField ([constraints_i_provide]); $ this-> assertEquals ($ expected, $ actual); }
이제 테스트를 위해 Reflection을 사용하여 가시성을 변경하는 것은 좋은 습관이 아니라는 것을 읽었습니다.
그래서 두 가지 질문이 있습니다.
대답 하여 Schleis은 나를 생각하고, 인터넷에 내 친구와 함께 약간의 채팅 및 일부 리소스 후에 내가 시험에 필요한 기능을 추가 인수를 도입하여이 문제를 해결하기 위해 선택되었다.
함수를 일반화하고 ArrayHelper 종류의 클래스로 이동하여 추가로 진행하여 1) 테스트를 더 쉽게 수행하고 2) 필요한 경우 코드의 다른 부분에서 메서드를 활용할 수 있습니다.
리플렉션 사용의 문제점은 클래스 내부를 노출한다는 것입니다. 단위 테스트는 코드가 올바르게 작동 함을 입증하는 데 도움이되지만 리팩터링하고 현재 기능을 변경하지 않았는지 확인할 수도 있습니다.
따라서 리플렉션을 사용하여 내부 속성의 가시성을 변경하면 나중에 해당 속성을 제거 / 변경할 수 있습니다. 예를 들어, 즉석에서 또는 이와 유사한 것을 계산할 수 있다는 것을 알 수 있습니다.
클래스 테스트에서 어려운 것은 코드 냄새입니다.
$arrayField
추상적 인 방법으로 만 설정되는 이유는 무엇 입니까? 호출하기 전에이 클래스의 구현에서 해당 메서드를 호출하지 않으면 어떻게됩니까 getModifiedArrayField()
?
게시물의 이름과 설명을 기반으로이 클래스와 메서드로 의도하는 바를 말하기는 어렵습니다. 하지만 수업에서하고 싶은 일이 무엇인지 더 많이 고려해야 할 것 같습니다. 그리고 $arrayField
생성자에 제공 되도록 클래스를 변경하거나이 클래스 의 값을 설정하는 간단한 공용 메서드를 제공합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다