2009-04-13 3 views
0

行の挿入/更新をテストするために、投稿をシミュレートし、リダイレクトされていることを確認し、新たに挿入/更新されたテキストがページにあることを確認するテストを作成しました。コードは機能しますが、テストではありません - なぜそれが間違っているのか教えてください。 IDパラメータを使用してインデックスページには、適切なテキストが含まれ、かつ主張Zend FrameworkとPHPUnitを使用してデータベースに行を追加する方法は、1つのユニットでどのようにテストされますか?

public function testEditProduct() { 
    $request = $this->getRequest(); 
    $request->setMethod('POST'); 
    $request->setPost(array(
     'id'=>'1', 
     'title'=>'Test Product 1a' 
    )); 
    $this->dispatch('/product/edit/id/1'); 
    $this->assertRedirectTo('/'); 
    $this->assertQueryContentContains('a', 'Test Product 1a'); 
} 
public function testAddProduct() { 
    $request = $this->getRequest(); 
    $request->setMethod('POST'); 
    $request->setPost(array(
     'title'=>'Test Product 3' 
    )); 
    $this->dispatch('/product/add/'); 
    $this->assertRedirectTo('/'); 
    $this->assertQueryContentContains('a', 'Test Product 3'); 
} 

次のテストの両方の仕事は、その製品のタイトルは、もはやページに表示されている製品を削除した後。あなたの最初のテストで

public function testIndexPageListsProducts() { 
    $this->dispatch('/product/index/id/1'); 
    $this->assertQueryContentContains('h1', 'Test Product 1'); 
} 

public function testDeleteProduct() { 
    $request = $this->getRequest(); 
    $request->setMethod('POST'); 
    $this->dispatch('/product/delete/id/2'); 
    $this->assertRedirectTo('/'); 
    $this->assertNotQueryContentContains('a', 'Test Product 2'); 
} 

答えて

2

、私が正しいんだ場合は、ユニットテストフレームワークは、リダイレクトを実行しません

$this->assertRedirectTo('/'); 

$this->resetRequest(); 
$this->resetResponse(); 

$this->disptach('/'); 
$this->assertQueryContentContains('a', 'Test Product 3'); 

$this->assertRedirectTo('/'); 
$this->assertQueryContentContains('a', 'Test Product 3'); 

を変更。どのリダイレクトが要求されたのかを追跡しますが、実際にはリダイレクトしません。

あなたのコードでは、編集ビュー/アクションで「テスト製品3」が存在するかどうかをチェックしており、そのテストはもちろん失敗します。最初に索引を要求してから、テストを実行する必要があります。

0

ご協力いただきありがとうございます。 $this->resetRequest();$this->resetResponse();がエラーを投げたが、method summary for Zend_Test_PHPUnit_ControllerTestCaseを確認したところ、$this->reset();が見つかりました。リンクされたページにはあなたが言及している方法がリストされていますが、

$this-reset();だけでもエラーが発生しましたが(このアプリケーションではデフォルトモジュールが定義されていません)、後で$this->bootstrap();と呼ぶとテストが成功しました。これは有効な解決策ですか?わかりやすくするために、私のテストコードは次のようになりました:

public function testEditProduct() { 
    $request = $this->getRequest(); 
    $request->setMethod('POST'); 
    $request->setPost(array(
     'id'=>'1', 
     'title'=>'Test Product 1a' 
    )); 
    $this->dispatch('/product/edit/id/1'); 
    $this->assertRedirectTo('/'); 

    $this->reset(); 
    $this->bootstrap(); 
    $this->dispatch('/'); 
    $this->assertQueryContentContains('a', 'Test Product 1a'); 
} 
public function testAddProduct() { 
    $request = $this->getRequest(); 
    $request->setMethod('POST'); 
    $request->setPost(array(
     'title'=>'Test Product 3' 
    )); 
     $this->dispatch('/product/add/'); 
    $this->assertRedirectTo('/'); 

    $this->reset(); 
    $this->bootstrap(); 
    $this->dispatch('/'); 
    $this->assertQueryContentContains('a', 'Test Product 3'); 
} 
関連する問題