2010-11-21 3 views
3
나는 내가 만든 테스트에서 assertRedirectTo()에 문제가 있어요

는 아래 내가 사용한 코드입니다 .php /) 그리고 여기에 게시물 세부 정보를 제출하면/feed/(index.php/feed /)로 리디렉션됩니다. 내가 제공 한 세부 사항은 정확하고 phpunit을 그들이 잘못 말하고있다 그러나 나는 데 문제를 작동합니다 : 바로 이해한다면phpunit을하고 젠드 프레임 워크 assertRedirectTo() 문제

There was 1 failure: 

1) IndexControllerTest::testLoggedInIndexAction 
Failed asserting response redirects to "/feed/" 

/home/public_html/mashhr/library/Zend/Test/PHPUnit/Constraint/Redirect.php:190 
/home/public_html/mashhr/library/Zend/Test/PHPUnit/ControllerTestCase.php:701 
/home/public_html/mashhr/tests/application/controllers/UserControllerTest.php:36 
+0

은 indexControlleR의 작업을 제공하나요? 그렇다면 다음을 시도하십시오 : $ this-> assertRedirectTo ('/ index/feed'); – opHASnoNAME

+0

아니요 완전히 다른 컨트롤러입니다. – Prisoner

답변

3

@poelinca : (! 올바르게 호출 된 경우에도) 아니, 단순히 Zend_Test가 리디렉션을 등록하는 신뢰할되는 경우 그의 경우

는 실제 응용 프로그램은 제대로 사용자를 리디렉션 의심의 여지 ,하지만 Zend_Test 환경에서 제대로 리디렉션이라는 등록에 문제가 있습니다. 내가 생각할 수있는 최선의 응답은 응용 프로그램에서 실제로 작동하는 실패한 assertRedirect를 생략하는 것입니다.

이것은 최적의 상황은 아니지만 문제가있는 곳을 Zend 코드로 파고 들지 않으면 효율성을위한 최선의 방법이 될 수 있습니다. 이것은 단위 테스트에서 나쁜 이름을 얻는 원인의 예입니다. 실제로 작동하는 테스트를 통과하도록 코드를 변경해야합니다.

http://framework.zend.com/issues/browse/ZF-7496을 참조하십시오. 문제는 모든 리디렉션과 관련이 있습니다. 특히 원래 컨트롤러를 디스패치하는 대신 헤더를 설정하고 종료해야하는 문제가 있습니다.

이유가 무엇이든이 동작으로 인해 리디렉션이 항상 실패하지는 않지만 대신 매우 신뢰할 수 없습니다. 누구든지이 문제에 대한 더 나은 해결 방법을 알고 있다면 (일반적이며 OP 코드와 관련이 없을 수도 있음) 알려 주시기 바랍니다.

+0

유익한 답변 주셔서 감사합니다. – Prisoner

+0

또한 컨트롤러 init()에서 리디렉션을 모두하는 경우 - 예를 들어 Zend Controller Action 클래스를 기본 클래스로 랩핑하고 모든 방법으로이 작업을 수행한다고 가정 해 보겠습니다. (init()) if (cond) { return $ this-> redirector-> gotoSimple ('logout', 'login', 'default'); } 앱이 정상적으로 작동하면 테스트를 통과해야하며 그렇지 않은 경우 실패합니다. – RiverC

0

그래서, 당신은 (ID이 완벽 말) 실패 테스트를 썼다.

테스트 패스를 작성하려면 응용 프로그램을 디버그하고 문제가있는 곳을 확인해야합니다.이 경우 실제 리디렉션을 보거나 양식에서 보낸 게시 필드를 확인해야합니다. , 아마도 라우팅을 확인하십시오. 인덱스 컨트롤러/폼/뷰 및 피드 컨트롤러에 코드를 게시하지 않으면 여기 아무도 질문에 대답 할 수 없을 것입니다.

+1

allso 내 이해에서 폼을 테스트하는 적절한 방법은 mocks와 스텁을 사용하여 여기에서 확인하십시오 (그는 isValid true/false에 리다이렉션을 테스트하고 있습니다) http://avnetlabs.com/zend-framework/tdd-with-zend -framework-mocks-and-stubs –

3

이 문제가 발생하는 동안 문제가 발생했습니다. 나는 일을 결국 다음

$this->assertRedirect(); 
$responseHeaders = $this->response->getHeaders(); 
$this->assertTrue(count($responseHeaders) != 0); 
$this->assertArrayHasKey('value', $responseHeaders[0]); 
// in my case I'm redirecting to another module 
$this->assertEquals('/module/controller/action', $responseHeaders[0]['value']); 
1

내가 나는 그것이

그러나 문제가있다 .. 내 예입니다 (느릅 나무 수동으로하는 경우에 실제로 작동) :

// controller modules/picking/orders/product 
$orderId = $this->_getParam('oId');  
if (empty($orderId)) { 
    return $this->_redirect('picking/orders/browse/invalid/empty'); 
} 

// test 
$this->dispatch('picking/orders/product'); 
$this->assertRedirect(); // ok 
$this->assertRedirectTo('picking/orders/browse'); // error 
$this->assertRedirectTo('picking/orders/browse/invalid/empty'); // error 

나는 오류를 발견했습니다!

'.../public//picking/orders/browse/invalid/empty' 
'.../public/picking/orders/browse/invalid/empty' 

... preprended 슬래시가 문제를 해결 고정 :


사실, 다음 예제 난 내 예제에서 문자열 comparizon에 오류가 있음을 발견했습니다 위! ;)

0

나중에이 문제가 발생했으며 Url 클래스가 잘못된 URL을 작성하지 못했습니다 (잘못된 매개 변수를 전달하는 중) 오류가 발생했지만 PHPUnit에 오류가보고되지 않았습니다 (PHPUnit이 오류).

url 매개 변수를 수정하면 url과 함께 어설 션을 수정합니다.