2011-01-06 3 views
1

싱글 톤 클래스를 인스턴스화 할 수 없도록 테스트 케이스를 작성하려고합니다. 내 테스트는 다음과 같다 있도록 싱글의 생성자는 개인으로 정의된다 (:: __ 구조 개인 싱글로 전화 :PHP에서 simpletest로 치명적인 오류를 예상하는 방법

$this->expectError(); 
$test = new TestSingletonClassA(); 

가 대신 오류를 잡기 시험을 전달하는, 나는 'PHP 치명적인 오류) '. 나는 또한 expectError에 대한 매개 변수로 PatternExpectation을 전달하려고했지만 그 중 하나도 작동하지 않았습니다. 의견 있으십니까?

일부 배경 : php5.3, simpletest1.1a

답변

-1

내가 그것을 그런 식으로 할 수 있다고 생각하지 않습니다 .. 치명적인 오류가 내가 그것을 이해 한대로 잡을 수 없습니다. 리플렉션을 사용하여 생성자 메서드를 얻은 다음 액세스 한정자가 "private"인지 확인할 수 있습니다.

대부분의 언어로 테스트하기가 어렵습니다. 예를 들어 java, C# 및 C++에서는이 코드를 컴파일 할 수 없습니다. 그래서 전혀 실행될 수 없습니다. D :

+0

이 상황에서 테스트 케이스 대신 정확한 디자인에 집중해야할까요? 내 구현에서는, 싱글 톤은 추상 클래스입니다. 그래서 저는 서브 클래스가 public 생성자를 구현할 수 없도록 보장하고, private 생성자를 오버라이드 (override) 할 수있는 방법을 원합니다. 내가 이것을 할 수있는 방법이 있습니까? –

+0

저는 그렇게 생각하지 않습니다.하지만 생성자가 호출되어서는 안되는 경우 호출되지 않도록하는 다른 방법이 있습니다. 한 가지 방법은 인스턴스화 된 클래스를 추적하는 배열을 갖는 것입니다. 다른 하나는 debug_stacktrace를 사용하여 일부 get_instance 메소드 내에서 호출 스택이 있는지 확인합니다. 두 전략 모두 기본 클래스의 생성자 내부에 적용됩니다. 또한, 당신은 기본 클래스 생성자를 보호해야 할 것 같아요, 또는 하위 클래스 생성자 아마도 부모를 호출 할 수 없을 것입니다 : : __ construct – davogotland

0

PHP가 치명적인 오류를 발생 시키면 phpunit에 도달하지 않으므로 테스트를 위해 "올바른"코드를 작성해야합니다. private 메소드를 호출하면 excepcion이 발생하여 phpunit에 전달되지 않습니다. 당신은 그것을 바꿔야합니다.

개체를 조롱해야한다고 생각합니다. 이 주제에 대해 these posts (일련 번호가 4 개의 게시물)과 these slides (슬라이드 # 43에서)을 시도해보십시오.

0

단위 테스트 프레임 워크는 이러한 것을 포착 할 수 없습니다. 하지만 PHPT 및 유사한 회귀 테스트 프레임 워크를 사용하면됩니다.

PHPUnit에 연결하기 위해 일부 농구를 뛰어 넘어야 할 수도 있지만 나머지 테스트와 통합 할 수있는 방법이있을 것입니다. 어설 션과 치명적인 오류가 예상되는 특별한 경우를 구분하면됩니다.

관련 문제