2017-09-28 7 views
1

은 내가 getEntityManagergetObject 방법을 테스트 한방법, 모의 이름 클래스

public function prePersist(LifecycleEventArgs $event) 
{ 
    $em = $event->getEntityManager(); 
    $entity = $event->getObject(); 
    $metadata = $em->getClassMetadata(get_class($entity)); 

} 

같은 하나 개의 방법이 있지만,이 getClassMetadata 방법과 각각의 매개 변수를 테스트하는 시간이다 매개 변수처럼이있는 방법을 테스트 이 경우에는 하나뿐입니다! ...

Mock_ObjectManager_126b0394 
Mock_ObjectManager_cc9f593f 
Mock_ObjectManager_8e119a34 

진짜 이름 클래스를 반환하지 않습니다와 나는 getClassMetadata를 호출 할 때 첫 번째 매개 변수 세트를 확인하려면 :

get_class($entity) 

위의 라인 (임의) 이름의 클래스를 반환합니다.

$test = $this; 
    $this->em->expects($this->at(0)) 
      ->method('getClassMetadata') 
      ->with(
       $this->callback(function($arg) use ($test) { 
       $test->assertThat($arg, 
        $this->logicalAnd(
        $this->equalTo('ObjectManager') 
       ) 
       );//assertThat 
       return true; 
       }) // callback          
      ) 
      ->willReturn($this->objectManager); 

테스트 방법은 무엇입니까?

답변

1

문제는 PHPUnit이 클래스를 모방하여 해당 임의의 이름을 할당한다는 것입니다. 나는 두 가지 (내 의견으로는, hackish) 옵션을 본다 :

우선, 더 나쁜 것은 생산 코드를 수정해야하기 때문이다. get_class() 대신 get_parent_class()을 사용할 수 있습니다. 따라서 모의 이름 대신 ObjectManager이 표시됩니다. 이것은 분명히 좋지 않은, 그리고 ObjectManager 아이 클래스 인 경우, 그것은get_parent_class()이 바로 위 부모가 아닌 최상의 부모를 얻을 수있는 모든 (편집에서 작동하지 않습니다, 그래서 아직도 그 경우에 일할 수 - EDIT2이 원 ObjectManager이 자식 클래스가 아니면 false을 반환하고 테스트 내부의 이름에서 클래스를 인스턴스화하고 ObjectManager의 자식이라고 주장하는 대신 시도하십시오.

$this->callback(function($arg) use ($test) { 
    $test->assertContains("ObjectManager", $arg);//assertThat 
    return true; 
}) // callback 
+0

'assertContains '는 좋은 해결책이 될 수 있습니다 :

다른 옵션은, 그렇게 나쁘지하지만 여전히 완벽하지, ObjectManagerassertContains()과 인수에 포함되어 있는지 확인하는 것입니다. – jjoselon