2014-11-21 96 views
0

嘲笑聲稱模擬對象應該返回某個類實例嗎?一個被吸引的對象應該如何實現這一點?嘲笑如何斷言類實例

比方說,我正在使用一個模擬的實體管理器+庫,它會返回一個模擬的MyClass對象。

我正在使用存儲庫測試一個應該返回一個MyClass實例(顯然不是一個模擬的Myclass)的工作類。

問題是,當我注入模擬實體管理器+存儲庫時,它正在使用MockedMyClass實例工作,並且當存儲庫「從db獲取東西」時,它返回MockedMyclass對象,僅僅是因爲模擬存儲庫返回一個模擬對象。

我應該如何創建一個像這樣的測試? 作爲參考,這裏是我創建的嘲笑對象

protected function getMockEM($empty = self::REPO_NOT_EMPTY) 
{ 
    $emMock = M::mock('Doctrine\ORM\EntityManager', array(
      'persist' => null, 
      'remove' => null, 
      'flush' => null, 
      'getRepository' => $this->getMockRepository($empty) 
    )); 
    return $emMock; 
} 

public function getMockMyClass() 
{ 
    $pnMock = M::mock('MyNamespace\MyClass', array(
      'getUser'    => $this->getMockUser(), 
      'getSchedule'   => $this->getMockSchedule($this->getDefaultStartingScheduleTime()), 
      'getStartingTime'  => $this->getDefaultStartingScheduleTime(), 
      'getNotificationTime' => $this->getDefaultStartingScheduleTime()->modify("- ".$this->getDefaultNotificationTime()." minutes") 
    )); 

    return $pnMock; 
} 

public function getMockRepository($empty = self::REPO_NOT_EMPTY) 
{ 
    if ($empty) { 
     $repoMock = M::mock('Doctrine\ORM\EntityRepository', array(
      'findOneBy' => null 
     )); 
    } else { 
     $repoMock = M::mock('Doctrine\ORM\EntityRepository', array(
      'findOneBy' => $this->getMockMyClass() 
     )); 
    } 


    return $repoMock; 
} 

....

$this->assertSame('MyClass',get_class($worker->doMethodThatShouldReturnaMyClassInstance())); 

回答

1

由於MockedMyClass延伸MyClass的你可以檢查返回的對象是使用assertInstanceOf一個MyClass的實例。

$this->assertInstanceOf('MyClass', $worker->doMethodThatShouldReturnaMyClassInstance()); 
+0

這太棒了,我不知道。除了默認指南外,你是否碰巧有更多資源嘲笑?我在網上找到了相當缺乏的信息 – Stormsson 2014-11-21 15:34:50

+1

是的,它擴展了原來的課程,以便它繼續在相同的地方工作,例如,在[類型提示](http://php.net/manual/en/language.oop5.typehinting.php)中。不幸的是,除[主文檔](http://docs.mockery.io/en/latest/)之外,我不知道任何好的資源。 – dchesterton 2014-11-21 16:28:18