2012-03-23 6 views
0

웹 서비스에서 JSON 객체를 가져 오는 모델을 호출하는 컨트롤러 액션이 있습니다. JSON 객체는 mapper 클래스를 통해 PHP 객체로 변환되어 내보기에서 사용됩니다.Zend Framework에서 모의 ​​객체로 뷰 렌더링을 테스트합니다.

웹 서비스 응답을 조롱하고 내 매퍼 클래스를 호출하여 PHP 객체에 응답을 매핑 한 다음 내 객체에서 해당 객체를 사용하는 단위 테스트를 작성하고 싶습니다. 이렇게하면 assertQueryContentContains()을 사용하여 값이 내 개체에 제대로 매핑되고 내보기에 채워 졌는지 확인할 수 있습니다.

가장 좋은 방법은 무엇입니까?

지금까지, 내 ​​단위 테스트 클래스에서이있어 :

$view->search_session = new Zend_Session_Namespace('search'); 

Zend_Registry::set('is_mobile', false); 

$view = new Zend_View(); 
$view->setScriptPath(APPLICATION_PATH . '/views/scripts/'); 
$view->addHelperPath(APPLICATION_PATH . '/views/helpers'); 

$layout = Zend_Layout::getMvcInstance()->setLayoutPath(APPLICATION_PATH . '/layouts/scripts/')->setLayout('layout-internal'); 

$layout->setView($view); 

$mapper = new ListingDetailMapper(); 
$listing = $mapper->map($this->_createMockListing(), new ListingDetail()); 

$view->listing = $listing; 

$this->getResponse()->setBody($layout->render()); 

$this->assertQueryContentContains('h3.fn', 'Test Business'); 
나는이 함께이 문제는 내가 수동으로 일반적으로 내 부트 스트랩에 설치 될 설치 모두에 봉착한다는 것입니다

또는 요청 파일을 정상적으로 디스패치하는 경우 구성 파일.

모의 객체를 내 뷰에 삽입하는 방법이 있습니까? $this->dispatch()을 사용하여 컨트롤러 동작을 디스패치하면 자동으로 뷰를 렌더링 할 수 있습니까?

아니면 웹 서비스 응답을 반환하고 어떻게 든 내 컨트롤러에 주입하는 모델 클래스를 조롱해야합니까?

내가 마치 $this->dispatch()라고 불렀던 것처럼 내 환경을 다시 만들어야하는 것으로 너무 힘들어하고있는 것처럼 보입니다. 또한 실제 환경에서와 동일한 설정 코드를 사용하지 않는 경우 테스팅의 목적에 어긋납니다.

답변

3

테스트의 유형을 결정해야합니다. 지금은 단위 테스트를하려는 것입니다. 당신이 당신의 질문에 말을 읽기에서

당신 같은 소리 실제 환경

에서 당신처럼 같은 설정 코드를 사용하지 않는 경우는 가지 테스트의 목적을 패배

시스템 테스트를하고 싶다.

시스템 테스트를 원하면 dispatch()를 완전히 사용하십시오. 동시에 테스트 데이터를 가져 오거나 제거하려면 데이터베이스/데이터 스토어를 자동화해야합니다.

단위 테스트를 수행하려는 경우보기 스크립트로 인해 어려움이 있습니다. 뷰 스크립트는 실제로 레이아웃을 인식하지 않아야합니다. 문제를 해결할 수 있다면 코드를 정리할 수 있습니다. 뷰 스크립트는 Zend_Registry를 인식하지 않아야합니다. Zend_Registry가 패턴 이름 뒤에 숨어있는 전역 변수라는 것을 잊지 마십시오. Zend_Session을 인식하면 안된다고합니다. 이러한 클래스가 제공하는 모든 데이터는 컨트롤러 또는보기 도우미에서 설정해야합니다. 코드를 수정할 수 있으면 해당 코드를 정리할 수 있습니다.

코드의 종속성이 많을수록 테스트를 설정하는 것이 더 많다는 것을 명심해야한다는 기본 원칙이 있습니다. 지금 당신의 뷰 스크립트는 많은 의존성을 가지고 있기 때문에 단위 테스트에 더 많은 작업이 필요한 것입니다.

+0

답변 해 주셔서 감사합니다. 당신은 내 다른 질문에 답했습니다. 그리고 평소와 같이, 당신은 큰 도움이되었습니다. 당신은 그것이 있어서는 안되는 것에 대해 인식하고 있다는 것에 대해 절대적으로 옳습니다. 나는 당신의 제안을 고려하여 몇 가지 것을 다시 생각 해냈다.레지스트리에 대한 참조가 레이아웃에 있었고 뷰를 테스트하기 위해 레이아웃을 인스턴스화 할 필요가 없었습니다. 컨트롤러가 세션 요소를 처리하도록 허용하는 것은 유닛 테스트에서 볼 수있는 것을 나타 내기 위해 뷰 변수를 설정할 수 있습니다. 결국, 나는 더 간단한 테스트로 끝내었다. 다시 한번 감사드립니다. – Luke

+0

코드를 테스트하려는 사람은 내 친구입니다.). 기꺼이 도와 드리겠습니다. 저는이 모든 것을 힘들게 배웠습니다. 그래서 저는 자동화 된 테스트 사랑을 퍼트 리려고합니다. – SamHennessy

관련 문제