2016-03-24 9 views
0

モックを使ってコントローラをテストしたい。私はクラスMandrillApiを模擬するにはどうすればよい私のコントローラCakephp 3はモックを使ってコントローラをテストする

public function myAction() { 
    $email = new MandrillApi(['template_name'=>'myTemplate']); 
    $result = $email 
     ->subject('My title') 
     ->from('[email protected]') 
     ->to('[email protected]') 
     ->send(); 

    if (isset($result[0]['status']) && $result[0]['status'] === 'sent') 
     return $this->redirect(['action' => 'confirmForgotPassword']); 

    $this->Flash->error(__("Error")); 
} 
試験で

public function testMyAction() { 
     $this->get("users/my-action"); 
     $this->assertRedirect(['controller' => 'Users', 'action' => 'confirmForgotPassword']); 
    } 

?お使いのコントローラのテストでは、あなたに

+0

私はまずクラスを模擬する必要があるかどうかを最初に評価します。私はあなたのテストでライブAPIにデータを送信したくないと思いますか?資格を渡さないとすれば、クラスはいくつかのグローバルな設定値を読み込むと思います。ダミーのエンドポイントにデータを送信するように設定することは可能でしょうか? – ndm

+0

はい、このapiのテストキーを渡すことは可能ですが、コントローラでクラスをモックすることが可能かどうかを知りたいのですが – Ozee

答えて

2

に感謝:

public function controllerSpy($event){ 
    parent::controllerSpy($event); 
    if (isset($this->_controller)) { 
     $MandrillApi = $this->getMock('App\Pathtotheclass\MandrillApi', array('subject', 'from', 'to', 'send')); 
     $this->_controller->MandrillApi = $MandrillApi; 
     $result = [ 
      0 => [ 
       'status' => 'sent' 
      ] 
     ]; 
     $this->_controller->MandrillApi 
      ->method('send') 
      ->will($this->returnValue($result)); 
    } 
} 

コントローラが正しく設定されたら、controllerSpyメソッドは嘲笑オブジェクトを挿入します。 controllerSpyメソッドを呼び出す必要はありません。テストで$this->get(...呼び出しを行った後、自動的に実行されます。

もちろん、モック生成のApp\Pathtotheclass部分をMandrillApiクラスの場所に合わせて変更する必要があります。

関連する問題