2010-07-14 2 views
33

instanceof를, 내가 특정 객체가 인터페이스를 구현 있는지 확인합니다 : phpunit을 말했다 인터페이스의 모의 객체를 생성, 그러나phpunit을, 인터페이스를 조롱하고, 내 코드에서 때때로

if ($instance instanceof Interface) {}; 

를, 그럴 수 없어 그 시험에 합격 한 것 같습니다.

// class name is Mock_Interface_431469d7, does not pass above check 
$instance = $this->getMock('Interface'); 

나는라는 클래스 인터페이스를 갖는 인터페이스를 구현하는 클래스 다르다는 것을 이해하지만, 나는이와 거래를하는 방법을 모르겠어요.

인터페이스를 구현하는 구체적인 클래스를 조롱하게 되었습니까? 이식성을 위해 인터페이스를 사용하는 목적을 저버리지 않을까요? 이것은 나를 위해 작동

감사

답변

38

:

$mock = $this->getMock('TestInterface'); 
$this->assertTrue($mock instanceof TestInterface); 

아마 오타 아니면 $ 인스턴스가 당신이 생각하지 않는 무엇입니까?

+12

긍정 쿨러 헤드 우선. 수면을 취한 밤이 지나면 객체를 조롱 할 때 정규화 된 네임 스페이스를 사용하지 않는다는 것을 깨달았습니다. –

+0

약간 다른 유스 케이스이지만 인스턴스가 클래스 또는 모의 클래스의 인스턴스인지 확인할 수 있습니다. – kapad

+0

@kapad 당신은 현재의 객체가 클래스 나 모의 객체인지 여부를 알 필요가없는 다형성의 주요 포인트입니다. 당신이 아직도 알아야 할 필요가 있다면, 당신은 그릇된 행동을합니다. P. 그냥 참고로 [get_class] (http://ca1.php.net/manual/en/function.get-class.php) 함수를 사용하여 객체의 정확한 클래스 이름을 알 수 있습니다. – dVaffection

47

3.5.0

예의로 assertInstanceOf도이다

$this->assertInstanceOf('\Models\User', $this->userService->findById(1)); 
+2

_이 방법을 사용하는 것이 좋습니다. – stefgosselin

+1

@stefgosselin 응답 외에도 오류 메시지를보다 잘 설명하기 때문에 형식 검사에 권장되는 방법입니다. '''Class'''의 인스턴스가''false'가 true라는 것을 선언하는 데 실패했다는 것을'''비교하지 못했습니다 .'''를 비교하십시오. –

+2

PHP 5.5부터는 '\ Models \ User'대신'\ Models \ User :: class'를 사용할 수 있으므로 리팩토링을 훨씬 쉽게 할 수 있습니다. –

관련 문제