2015-01-19 3 views
1

PHPUnit에서 비정상적인 클래스 로딩 문제가 발생했습니다. 처음에는 4.3.5로, 최근에는 4.4.2로 가장 최근에 안정적이었습니다. .PHPUnit이 자동/수동으로 부트 스트랩에로드 된 경우 테스트 클래스를 찾을 수 없습니다.

필자는 phpunit.xml을 통해 자동으로로드되는 부트 스트랩 파일을 가지고 있습니다.이 파일에는 작성자의 기본 자동 로더와 자체 자동 공급기가 포함되어 있습니다. 이것은 정상적으로 작동합니다. 그러나 부트 스트랩 을 부트 스트랩에로드하면 PHPUnit에서 클래스 이름을 올바르게 확인할 수 없어로드되지 않습니다.

는이 오류를 얻을 :

Class 'test/unit/tests/UpdateAllTest' could not be found in '/full/project/path/webapp/test/unit/tests/UpdateAllTest.php'.

(부트 스트랩에서 테스트 클래스를 참조하고자하는 나의 목적은 관련된 테스트 파일로 유지, 각 하나의 데이터베이스 구축 방법을 추가하는 것입니다 . 나는이 방법을 setUp() 메서드가 아닌 부트 스트랩에서 수행 할 계획입니다. 테스트 메서드마다 한 번이 아니라 모든 테스트에서 한 번 실행되기를 원하기 때문입니다.

필자는 PHPUnit 자체 (특히 PHPUnit_Runner_StandardTestSuiteLoader::load)에서 약간의 디버깅 작업을 수행했으며 클래스 이름이 경로로 제공되고 이름 공간이 아닌 클래스 이름이 아니라는 것을 알았습니다. 여기에 관련 절입니다 :

if (class_exists($suiteClassName, false)) { 
     $class = new ReflectionClass($suiteClassName); 

     if ($class->getFileName() == realpath($suiteClassFile)) { 
      return $class; 
     } 
    } 

$suiteClassName의 값은 test/unit/tests/UpdateAllTest입니다, 노골적으로 이름 공간에서 아무것도 아니다 - 그것은 Awooga\Testing\Unit\UpdateAllTest, 일반적으로 내 자동 로더의 커스텀 매핑에 의해 처리됩니다 뭔가해야합니다.

특히은 PHPUnit에서보기 드문 것으로 생각됩니다. 따라서 다른 누구도 경험하지 못했던 버그는 아닙니다. 이러한 상황에서 phpunit.xml 또는 이와 유사한 비정상적인 클래스 네임 스페이스를 선언해야합니까? 여기 빨대에 쥐고!

이 겉으로는 사소한 문제의 원인이 무엇인지에 대한 의견은 인정 될 것입니다. 그 동안 나는이 설정 방법을 다른 파일/클래스로 옮길 것입니다. 이상적인 것이 아니라 세상의 끝이 될 것입니다. 나는 PHP 5.5.x와 Ubuntu 12.04를 사용 중이다.

+0

부트 스트랩 파일의 클래스가 네임 스페이스입니까? – Schleis

+0

@Schleis, 고마워요. 클래스는 그렇습니다. 그리고 자동으로 잘로드됩니다. PHPUnit이 이미로드되었다는 사실을 깨닫지 못하고 인스턴스를 생성하지 못한다. – halfer

+0

질문에서 알 수 없지만 찾을 수없는 클래스를 적절한 네임 스페이스로 참조하고 있습니까? – Schleis

답변

1

이 문제는 해결되지 않았지만 빌드 방법이 너무 길어 어쨌든 다른 클래스에 표시되는 것이 좋습니다. *Test.php의 테스트에 해당 빌드 클래스가 *Build.php이되도록 명명 규칙이 있습니다.

PHPUnit의 부트 스트랩 시스템을 사용하여 빌드 클래스를 검사하고 자동으로 build()을 호출합니다.

1

아마도 this problem이 발생했을 수도 있습니다.

경로를 매개 변수로 사용하면 정상적인 동작이므로 PHPUnit_Runner_StandardTestSuiteLoader::load에서 더 자세히 확인하면 혼란스러운 오류 메시지가 표시됩니다.

+0

감사합니다. Ben, 그 소리가 아주 비슷합니다. 그 버그 보고서에 대해 어떻게 생각하는지 알려주세요. 나는 추적기도 검색했고 아무 것도 찾지 못했습니다. 나는 그것이 명백한 이슈 인 것처럼 보이기 때문에 나는 단지 잘못된 것을해야만한다고 생각했다. – halfer

+1

당신을 진심으로 환영합니다. 나는 기억하려고 노력할 것이다. 그러나 나는 그것이 곧 수정 될 것이라고 생각하지 않는다. – Ben