2013-04-10 1 views
0

성공적으로 젠드 프레임 워크 2 "Getting Started" 튜토리얼을 수행 한 후, 나는 그대로를 이어 Unit testing example for version 2.1에 시작하고, 나는 phpunit을과 실패를 얻을 :후행 슬래시로 인해 zend framework 2.1 예를 따르는 assertRedirectTo()와 관련된 phpunit에서 오류를 해결하는 방법은 무엇입니까?

Failed asserting response redirects to "/album", actual redirection is "/album/" 

여기에 IndexControllerTest.php 파일에서 코드의 관련 비트입니다 :

: 여기
public function testAddActionRedirectsAfterValidPost() { 

    $albumTableMock = $this->getMockBuilder('Album\Models\AlbumTable') 
          ->disableOriginalConstructor() 
          ->getMock(); 

    $albumTableMock->expects($this->once()) 
        ->method('saveAlbum') 
        ->will($this->returnValue(null)); 

    $serviceManager = $this->getApplicationServiceLocator(); 
    $serviceManager->setAllowOverride(true); 
    $serviceManager->setService('Album\Models\AlbumTable', $albumTableMock); 

    $postData = array('title' => 'Led Zeppelin III', 'artist' => 'Led Zeppelin'); 
    $this->dispatch('/album/add', 'POST', $postData); 
    $this->assertResponseStatusCode(302); 

    $this->assertRedirectTo('/album'); 
} 

내가 AlbumController.phpaddAction() 함수 내에서이 무엇3210

.htaccess 파일은 스켈레톤 애플리케이션과 함께 제공되는 것으로, 브라우저에서 http://localhost/zf2-tut/albumhttp://localhost/zf2-tut/album/이 제대로 처리되고 항목을 추가하는 과정에서 실제로 리디렉션된다는 테스트를 거쳤습니다. 나 후행 슬래시와 함께 URL로 다시.

나는 이것이 약간의 persnickety로서 벗어날지도 모르지만 나는 이것과 같은 문제를 해결하는 적절한 방법을 배우고 싶습니다.

어설 션 테스트를 후행 슬래시를 포함하도록 변경할 수 있지만 예제가 따르지 않고 toRoute() 메소드에 후행 슬래시가 없으므로 아마도 내가 실수 한 것으로 추정합니다. 내 코드 또는 환경을 어딘가에두고 테스트를 수행하는 데있어 테스트를 벗어나는 것이 나쁜 습관이라고 가정합니다.

이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 어딘가에서 후미 슬래시로 해결할 URL을 변경 한 경우 실제로이 경우 선호하지만 내 코드가 깨끗하고 애매하게 남겨 두지 않으므로 경로에 대한 정보를 명확하게 표시하고 싶습니다. 후행 슬래시가 예상됨을 나타냅니다.

참고로, 나는 개인적인 취향의 문제로 "모델"로 "모델"변화에 튜토리얼을 수행 한 후에도 내 폴더 구조와 네임 스페이스의 작은 변화를했다. 그것은 결코이 문제 (afaik)에 영향을 미치지 않습니다. 그러나 나는 그것이 붉은 청어가 아니기 때문에 그것을 지적하고 싶었습니다.


편집 : 나는 좀 더 취재와 함께, 내 질문을 게시 직후 내가 후행 슬래시가이 경우에 내 경로에 추가되는 방식 실현 및 게시 그 대답한다. 그러나 필자가 대답 한 바에 따르면 Zend Framework 2가 왜 선택적 일 때 슬래시를 추가하는지 이해하고 싶습니다. 또한 PHPUnit을 사용하여 올바르게 테스트하는 방법을 알고 싶습니다.

답변

0

난 내가 몇 일 전에 그것을 통해 갔다 튜토리얼에서 라우팅 설정에 대한 이상한 것을 기억하고이 모든 밖으로 내 메모리에 뭔가를 조깅 입력 같아요. 물론 충분히

Routing and controllers에 현재 표시되는 예를 보여줍니다 : 여기

'router' => array(
    'routes' => array(
     'album' => array(
      'type' => 'segment', 
      'options' => array(
       'route' => '/album[/][:action][/:id]', 
       'constraints' => array(
        'action' => '[a-zA-Z][a-zA-Z0-9_-]*', 
        'id'  => '[0-9]+', 
       ), 
       'defaults' => array(
        'controller' => 'Album\Controller\Album', 
        'action'  => 'index', 
       ), 
      ), 
     ), 
    ), 
), 

는 경로 옵션 일치 수 있습니다 그 자체에 캡슐화 앨범 후 후행 슬래시를 보여줍니다. 그러나 예제 바로 다음 단락과 여러 주석은 이전에 /album[/:action][/:id] 인 경로를 참조합니다. 현재 구현은 뒤에 슬래시가있는 경로로 리디렉션하는 효과가 있습니다.선택 사항 임에도 불구하고, 컨트롤러는 phpunit 테스트 (튜토리얼 섹션의 주석으로 판단했지만이 자습서의이 부분에 있었지만 현재는 별도의 섹션을 가지고 있습니다)에 실패하기 때문에 컨트롤러에 넣습니다.

이전 예제의 경로를 변경하면 후행 슬래시가없이 리디렉션되어 phpunit 테스트가 통과하지만 후행 슬래시가있는이 섹션으로 선택적으로 라우팅 할 수있는 능력이 떨어지는 것을 확인했습니다. 나는 이것에 선택적으로 매치 할 수있는 것을 선호한다.

그래서 "어떻게 된거 야?" 질문은 해결되었지만 선택적 매치를 테스트하는 방법을 알고 싶습니다. 아니면 여기에 슬래시가 있는지 확인하기 위해 어설 션 테스트를 수정해야합니다. 또한 Zend \ Mvc (또는 그렇지 않은 경우 프레임 워크의 관련 부분)가 선택 사항 인 경우 후행 슬래시를 사용하는 이유는 무엇입니까?

+0

더 많은 연구와 연구 끝에 Zend_Test에'assertRedirectRegex();'메소드가 있음을 발견했습니다. 실험 후, 다음 줄이이 테스트의 유효성을 검사하는 가장 좋은 방법 인 것으로 나타났습니다. $ this-> assertRedirectRegex ('/ \ {0,1} $ /'); – shadowzen

+0

후행 슬래시의 유무와 일치해야하지만 두 개 이상의 후행 슬래시가있는 경우 실패합니다. 이 작업을 수행 할 수있는 더 좋은 방법이 있다면 알려주십시오. 아직도 Zend \ Mvc가 옵션 인 경우 Zend \ Mvc가 강제로 슬래시를 강제하는 이유는 여전히 알지 못하지만 적어도 향후 테스트에서 해당 동작이 변경되면 적어도 내 테스트는 통과합니다. – shadowzen