2012-10-31 3 views
5

Ciao sono un nuovo to Zend tutti insieme e mi è stato chiesto di sviluppare con Z2. Sto cercando di aggiungere funzionalità riutilizzabili tramite i plugin del controller, ma non sto avendo successo con i test unitari. Funziona bene all'interno dell'applicazione normale.Plugin del controller Zend Framework 2 non disponibili nei test di unità

// 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', 
    ), 
), 
... 

l'errore che ottengo è:

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

risposta

12

Se si crea uno unit test per un controller, si prova il controller in un'unità dedicata, controllata. Non si inizializza l'applicazione, non si caricano i moduli e non si analizza il file di configurazione completo.

Per unit test del controllore, aggiungere il plug-te nel metodo setUp() per dirla come richiamabile direttamente nel gestore dei servizi. Se vuoi verificare se la tua configurazione funziona, stai piuttosto guardando i test funzionali. Prova ad avviare prima l'applicazione completa, quindi prova il controller creando una richiesta e asserendo la risposta.

Poiché i test funzionali sono un po 'più difficile da risolvere, è facile iniziare con controllore (plugin) per testare in una prova di unità:

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

È possibile sostituire setInvokableClass() da setService() per iniettare un mock per esempio .

+0

Grazie mille !!! Mi stava uccidendo! –

+0

Questa è una risposta antica, ma se sei ancora in giro con Jurian, o altri trovano questa risposta ... non appena chiami $ this-> controller-> indexAction() penso che tu sia nei guai dato che è probabile che un'azione del controller chiamerà qualcosa dalla classe AbstractActionController da cui il controller eredita. Nessuna inizializzazione del framework, niente di utile. –

+0

Non è necessario essere Greg, se indexAction non contiene chiamate a nessun metodo astratto, tutto va bene. –