2009-04-13 4 views
0

행 삽입/업데이트를 테스트하기 위해 게시물을 시뮬레이트하고 리디렉션되는지 확인하고 새로 삽입/업데이트 된 텍스트가 페이지에 있는지 확인하는 테스트를 작성했습니다. 코드가 작동하지만 테스트가 아닌 이유 - 왜 잘못되었는지 말해 줄 수 있습니까? ID가 매개 변수를 사용하여 인덱스 페이지가 적절한 텍스트를 포함하고 있다고 주장Zend Framework 및 PHPUnit을 사용하여 한 유닛이 데이터베이스에 행 추가를 테스트하는 방법은 무엇입니까?

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'); 
} 

다음의 시험을 모두 작업, 해당 제품의 제목은 더 이상 페이지에 표시되는 제품을 삭제 한 후. 내가 올바른 해요 경우, 단위 테스트 프레임 워크는 리디렉션을 실행하지 않습니다

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

$this->assertRedirectTo('/'); 

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

$this->disptach('/'); 
$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

은 변경할 수 있습니다. 요청 된 리디렉션을 추적하지만 실제 리디렉션은 수행하지 않습니다.

코드에서 편집보기/동작에서 '테스트 제품 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'); 
}