2017-03-27 20 views
0

내가 조롱하는

$mock->shouldReceive('setDatetime') 
      ->with($datetime) 
      ->once; 

나는 비교적 새로운 해요에 전달 설정 값의 날짜 객체가 있어야하는 방법을 조롱하려고 객체하지만 난 이해가 안 돼요 어떻게 '함께'일하고 있습니다. $ datetime이 'setDatetime'에 전달되는 정확한 객체이면 조건을 완벽하게 충족시킵니다. 그것이 datetime 객체이지만 정확히 같은 객체가 아닌 경우, 즉 모든 값이 같지만 인스턴스화 된 다른 DateTime 객체 인 경우 작동하지 않습니다. 현재 setDatetime에 전달중인 Datetime 객체가 DateInterval을 사용하여 변경되었습니다. 어쨌든 내가받는 datetime 객체가 동일한 객체가 아니더라도 동일한 값을 가지는지 테스트 할 수 있습니까?

답변

0

이것은 with()를 닫음으로써 가능합니다.

는 조롱이 당신에게 폐쇄 정규

Mockery\Matcher\Closure 

이 클래스는 폐쇄을 가지고 당신이 얻을 값과 일치하는 데 사용됩니다 제공 기능을 가진에 폐쇄를 제공합니다.

당신이 구현하는 것이 어떻게 이런 일이 같다 :

$expectedDateTime = new DateTime(); 
$mock->shouldReceive('setDatetime') 
      ->with 
       (new Closure(
       function($datetime) use ($expectedDateTime) { 
        return $datetime->getTimestamp() === $expectedDateTime->getTimeStamp() 
       } 
       ) 
      )->once; 

epextedDateTime는 여기에 추가하지만, 예를 들어 목적으로해야한다고 물론 날짜 시간입니다. 어설 션 외부에서 필요가 없으면 클로저에 DateTime 객체를 만들 수도 있습니다. 그러면 클로저에서 사용할 필요가 없습니다.

그리고 당연히 당신은 클로저에서 원하는 것을 무엇이든지 체크 할 수 있습니다. 나는 타임 스탬프가 같은지 검사하는 가장 쉬운 테스트를했습니다.

0

또 다른 해결책은 \Hamcrest\Matchers::equalTo을 사용하는 것입니다. 이렇게하면 === (엄격한) 대신 명시 적으로 비교가 == (같음)으로 설정됩니다. 프리미티브의 경우 대체로 == 비교를 자동으로 확인하기 때문에 객체에 대해서만 필요합니다.

예 :

$mock->shouldReceive('setDatetime') 
    ->with(\Hamcrest\Matchers::equalTo($datetime)) 
    ->once; 

문서는 기록 다음

그것으로 전화를받을 것을 조롱 알려줍니다 :

가장 일반적인 정규가와() 정규이다 정수 1을 인수로 갖는 foo 메소드. 이와 같은 경우 Mockery는 우선 === (동일) 비교 연산자를 사용하여 인수를 일치 시키려고 시도합니다. 인수가 프리미티브이고 동일한 비교에 실패하면 Mockery는 == (같음) 비교 연산자로 대체합니다.

개체를 인수로 일치시킬 때 Mockery는 엄격한 === 비교 만 수행하므로 동일한 $ 개체 만 일치합니다.

출처 : http://docs.mockery.io/en/latest/reference/argument_validation.html