2012-10-31 3 views
5

안녕하세요, 젠드에 새로 왔으며 Z2로 개발하도록 요청 받았습니다. 컨트롤러 플러그인을 통해 재사용 할 수있는 기능을 추가하려고하지만 단위 테스트에 성공하지 못했습니다. 그것은 정상적인 응용 프로그램 내부에서 잘 작동합니다.젠드 프레임 워크 2 컨트롤러 유닛 테스트에서 사용할 수없는 플러그인

// Application\Controller\Plugin\HelloWorld.php 
namespace Application\Controller\Plugin; 

use Zend\Mvc\Controller\Plugin\AbstractPlugin; 
use Zend\Http\Client; 
use Zend\Http\Request; 

class HelloWorld extends AbstractPlugin 
{ 

    public function helloWorld() 
    { 
     return "HELLO WORLD"; 
    } 
} 

// Application\Controller\IndexController.php 
namespace Application\Controller; 

use Zend\Mvc\Controller\AbstractActionController; 
use Zend\View\Model\ViewModel; 

class IndexController extends AbstractActionController 
{ 

    public function indexAction() 
    { 
     echo $this->helloworld()->helloWorld(); 
    } 
} 

//Application\config\module.config.php 
... 
'controller_plugins' => array(
    'invokables' => array(
      'helloworld' => 'Application\Controller\Plugin\HelloWorld', 
    ), 
), 
... 

내가 오류는 다음과 같습니다 당신이 컨트롤러에 대한 단위 테스트를 작성하는 경우

Zend\ServiceManager\Exception\ServiceNotFoundException: Zend\ServiceManager\ServiceManager::get was unable to fetch or create an instance for helloworld 

답변

12

, 당신은 전용 제어 장치의 컨트롤러를 테스트합니다. 응용 프로그램을 초기화하지 않고 모듈을로드하지 않고 전체 구성 파일을 구문 분석하지 않습니다.

컨트롤러를 단위 테스트하려면 setUp() 메서드에서 직접 플러그인을 추가하여 서비스 관리자에 직접 호출 할 수 있도록하십시오. 구성이 작동하는지 여부를 테스트하려면 기능 테스트를 고려해야합니다. 먼저 완전한 응용 프로그램을 부트 스트랩하고 요청을 작성하고 응답을 표시하여 컨트롤러를 테스트하십시오. 예를 들어 모의 주입

namespace SlmLocaleTest\Locale; 

use PHPUnit_Framework_TestCase as TestCase; 
use Application\Controller\IndexController; 

class IndexControllerTest extends TestCase 
{ 
    public function setUp() 
    { 
     $controller = new IndexController; 
     $controller->getPluginManager() 
        ->setInvokableClass('helloworld', 'Application\Controller\Plugin\HelloWorld'); 

     $this->controller = $controller; 
    } 

    public function testCheckSomethingHere() 
    { 
     $response = $this->controller->indexAction(); 
    } 
} 

setService() 의해 setInvokableClass() 교환 수 기능 테스트를 해결하기 위해 약간 어렵게하므로

, 제어기 시작하는 단위 테스트에서 테스트하기 (플러그인) 쉽다 .

+0

정말 고마워요! 그게 날 죽였어! –

+0

이것은 고대의 답변이지만 Jurian이나 다른 사람들이이 답변을 찾으면 $ this-> controller-> indexAction()을 호출하자마자 문제가 발생할 가능성이 높습니다. 컨트롤러 액션은 컨트롤러가 상속받은 AbstractActionController 클래스에서 무언가를 호출 할 것입니다. 프레임 워크가 초기화되지 않고 작동하지 않습니다. –

+0

Greg 일 필요는 없습니다. indexAction에 추상 메소드에 대한 호출이 없으면 모두 정상입니다. –

관련 문제