2012-04-16 18 views
3

私は料理の本にいくつかの例を見てきたが、私はそれを得るいけない: http://book.cakephp.org/2.0/en/development/testing.html#a-more-complex-exampleテストリダイレクトCakePHPの2.0

どのように私は、このような削除アクションにリダイレクトをテストすることができますか?

public function testDelete(){  
    $result = $this->testAction("/comments/delete/1"); 
    echo "this is not printed"; 
    print_r($this->headers);   
} 
+0

空のビューエラーが発生しているのだろうかと思います。とにかく削除ビューがないので、この場合はコントローラ上で 'render'関数を試してみることができます。 – jeremyharris

+0

それを嘲笑することはどういう意味ですか?そして、ええ、いいえ、リダイレクトは正常に動作し、ビューアクションは空ではありません。 – Alvaro

+0

Mockingは、特定のメソッドが必要なものを返す場所をテストする手順です。例えば、 'CakeRequest :: send()'は嘲笑され、何もしないように指示され、ヘッダを送信しません。模倣した方法に何を期待するか、またどのように対応するかを教えてもらえます(http://www.phpunit.de/manual/3.0/en/mock-objects.htmlを参照)。 Cakeを簡単に嘲笑するには、http://book.cakephp.org/2.0/ja/development/testing.html#using-mocks-with-testactionをご覧ください。'ControllerTestCase :: testAction()'はこれを自動的に行います。 – jeremyharris

答えて

6

削除アクションのテストは、他のアクションのテストと同じです。あなたのテストケースは、このように見えるかもしれません。

// notice it extends ControllerTestCase 
class PostsControllerTest extends ControllerTestCase { 

    function testDelete() { 
     $this->testAction('/posts/delete/1'); 
     $results = $this->headers['Location']; 
     // your OP code redirected them to a view, which I assume is wrong 
     // because the item would be deleted 
     $expected = '/posts/index'; 
     // check redirect 
     $this->assertEquals($results, $expected); 

     // check that it was deleted 
     $this->Posts->Post->id = 1; 
     $this->assertFalse($this->Posts->Post->exists()); 
    } 

} 

もちろん、これは明らかに明らかです。また、セッションをチェックして、例外が予想されるテストを作成することもできます。それでもまだテストケースの終わりに達していない場合や、続けている場合他のものはにあります。

generateメソッドをControllerTestCaseに設定すると、簡単なモックを生成できます。

function testDelete() { 
    $Posts = $this->generate('Posts', array(
    'components' => array(
     'Email' => array('send'), 
     'Session' 
    ) 
)); 
    // set ControllerTestCase to use this mock 
    $this->controller = $Posts; 

    $this->testAction('/posts/some_action_that_sends_email'); 
} 

上記は、テスト中に使用するPostsControllerのモックを最初に生成します。また、EmailComponentのsend()メソッドと、SessionComponent全体をモックします。

モックの詳細については

$idPostが定義されていないので、あなたがエラーを持っているhttp://book.cakephp.org/2.0/en/development/testing.html#using-mocks-with-testaction

+0

この呼び出しの後:$ this-> testAction( '/ posts/delete/1');何も実行されません。だから、私は$ results = $ this-> headers ['Location']を実行することすらできません。 リダイレクトにより、リダイレクトが停止します。 – Alvaro

+0

他に何かが起きているように聞こえます。完全なテストケースを投稿し、いくつかのデバッグ文を 'delete()'アクションに散らばり、リダイレクトを使用する別のアクションなどでチェックしてください。 – jeremyharris

0

エコーが印刷されることはありません、あなたの関数は常に終了する前に、リダイレクトを呼び出して「削除」:

public function delete($id = null){   
     $this->Comment->id = $id; 
     if (!$this->Comment->exists()) { 
      throw new NotFoundException(__('Invalid comment')); 
     } 
     if ($this->Comment->delete()) {   
      $this->Session->setFlash(__('Comment deleted')); 
      return $this->redirect(array('controller' => 'posts', 'action' => 'view', $idPost)); 
     } 
     $this->Session->setFlash(__('Comment was not deleted')); 
     return $this->redirect(array('controller' => 'posts', 'action' => 'view', $idPost));   
    } 
} 

テストでは、それもこのエコーを印刷しないように、リダイレクトコールの後に停止します。

1

可能:http://www.phpunit.de/manual/3.0/en/mock-objects.html

generate()の詳細については。

私はこのような何か書くでしょう:

public function delete($id = null){   
     $this->Comment->id = $id; 
     if (!$this->Comment->exists()) { 
      throw new NotFoundException(__('Invalid comment')); 
     } 
     if ($this->Comment->delete()) {   
      $this->Session->setFlash(__('Comment deleted')); 
     } else { 
      $this->Session->setFlash(__('Comment was not deleted')); 
     } 
     $this->redirect(array('controller' => 'posts', 'action' => 'view', $id));   
    } 
} 

をそして、それはこのようなものだテスト:

public function testDeleteWithSuccess() { 
     $Controller = $this->generate('Comments', array(
      'components' => array(
       'Session' 
      ), 
      'models' => array(
       'Comment' => array('exists') 
      ) 
     )); 

     $Controller->Comment->expects($this->once()) 
      ->method('exists') 
      ->will($this->returnValue(true)); 

     $Controller->Session->expects($this->once()) 
      ->method('setFlash') 
      ->with('Comment deleted'); 

     $this->testAction("/comments/delete/ID"); 

     $this->assertEquals($this->headers['Location'], 'http://'. $_SERVER['HTTP_HOST'] . '/posts/view/ID'); 
    } 
0
public function delete($id = null){   
    $this->Comment->id = $id; 
    if (!$this->Comment->exists()) { 
     throw new NotFoundException(__('Invalid comment')); 
    } 
    if ($this->Comment->delete()) {   
     $this->Session->setFlash(__('Comment deleted')); 
    } else { 
     $this->Session->setFlash(__('Comment was not deleted')); 
    } 
    $this->redirect(array('controller' => 'posts', 'action' => 'view', $id));   
} 

}

Plenix、 はその完全に間違っていないですか? コメントを削除して、コメントのIDを投稿のView Controllerに渡していますか?だから、投稿やコメントを見ているのですか?他の提案はありますか?