2012-07-01 5 views
-1

가능한 중복 :
Best practices to test protected methods with PHPUnitPHP에서 개인 속성에 액세스하려면 어떻게해야합니까?

class Footer 
{ 
    private $_isEnabled; 

    public function __construct(){ 
    $this->_isEnabled = true; 
    } 

    public function disable(){ 
    $this->_isEnabled = false; 
    } 
} 

내가 false로 _isEanabled을 설정 한 후 나는 디스 에이블 기능에 대한 단위 테스트를 쓰고 있어요, 나는 그것이 있는지 여부를 주장 할 그릇된.

그러나 어떻게 $_isEnabled에 액세스 할 수 있습니까?

public function testDisable(){ 
    $footer = new Footer(); 
    $footer->disable(); 
    $this->assertFalse($footer->_isEnable); 
} 

답변

2

짧은 답변 : 당신은 할 수 없습니다

이 내 테스트 기능입니다.

당신은 반사 사용하여 수행 할 수 있습니다 : 그것은 개인 수단 ...

긴 대답은 무엇

http://php.net/manual/en/book.reflection.php

그것은하지만, 조금 복잡를, 그래서 실패하는 경향이 또 다른 레이어를 추가

public function getEnabled() { 
    return $this->_isEnabled; 
} 
: 그것은

나는 오히려 getter 함수를 작성하는 것을 선호 ... 테스트를위한 최선의 방법이 아니다

하지만 간단하지 않은 경우에는 만들고 싶지 않다고 생각합니다.하지만 대안을 고려하면 다시 생각해 볼 수 있습니다.

+0

예 저는 알고 있습니다 ..이 예제는 단순한 것이지만 실제로는 더 복잡합니다. 개인 속성에 대한 액세스 권한을 얻고 싶습니다. 나는 반사 수업을 사용하여 개인적인 방법으로 그것을했다. 그러나 특성을 위해 그것을하는 방법을 knw하지 마라. – Yasitha

+0

http://www.php.net/manual/en/reflectionclass.getproperties.php –

1

접근성있는 속성은 공개되어야하며, 나는 그것이 자체 설명이라고 생각합니다. 그러나 공용 변수에 액세스하는 것과 비슷한 방식으로 보호 된 속성과 개인 속성에 액세스 할 수있는 코드가 발생할 수 있습니다.

마법 getter 메소드를 사용하여 수행됩니다 :

class Footer 
{ 
    private $_isEnabled; 

    public function __get($propName) 
    { 
     if (!isset($this->{$propName})) 
     { 
      throw new Exception($propName.' is not set'); 
     } 
     return $this->{$propName}; 
    } 
} 

이 마법 방법을 사용하거나, 존재하지 않거나 공개하지 않는 속성에 액세스하려고 할 때마다 호출됩니다. 한마디로 : 당신이 원하는대로 예를 들어, 밑줄이 더 이상 필요하지 않습니다, 그래서

$instance->_isEnabled;//will work. 

당신은 당신이 함께 할 수있는 일의 톤이있다 ...이 방법을 변경할 수 있습니다.
man pages

1

이 점에 의문을 제기합니다. 클래스가 "대수적으로"완료되지 않았습니다. public function isEnabled()가 없습니다. 단위 테스트에 상태에 대한 정보가 없으면 다른 클래스 클라이언트도이 정보를 놓칩니다.

개인용 테스트는 공용 API에서 아무 말도하지 않지만 내부 작업을 확인합니다. 이어야합니다.

일반적으로 구현에 의존하는 단위 테스트를하는 것은 바람직하지 않습니다. 다시 구현하면 단위 테스트가 유지됩니다.

관련 문제