2013-03-09 121 views
0

我正在對我的控制器進行單元測試,名爲IndexController(使用http://framework.zend.com/manual/2.1/en/user-guide/modules.html教程)。zf2 phpunit控制器依賴關係

我的IndexController有一個依賴關係:Translator $translator

<?php 
// module/Application/src/Application/Controller/IndexController.php 

namespace Application\Controller; 

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

class IndexController extends AbstractActionController 
{ 
    protected $translator; 

    public function __construct(Translator $translator) 
    { 
     $this->translator = $translator; 
    } 

    public function indexAction() 
    {     
     $steeringWheelMapper = $this->getServiceLocator()->get('SupplierName\Mapper\SteeringWheel'); 
     $carBrandList = $steeringWheelMapper ->fetchCarBrandList(); 
     return new ViewModel(); 
    } 
} 

我的單元測試設置:

  • 模塊
    • 應用
      • 測試
        • ApplicationTest
          • 控制器
            • IndexControllerTest.php
        • bootstrap.php中
        • phpunit.xml.dist
        • TestConfig.php.dist

現在測試出現以下錯誤: Argument 1 passed to Application\Controller\IndexController::__construct() must be an instance of Zend\I18n\Translator\Translator, none given。 這裏沒有什麼奇怪的,但我找不到在哪裏添加翻譯對象。

任何人都可以告訴我,我應該在哪裏添加翻譯對象?

在此先感謝!

代碼

<?php 
// module/Application/test/Testconfig.php.dist 
return array(
    'modules' => array(
     'Application', 
    ), 
    'module_listener_options' => array(
     'config_glob_paths' => array(
      '../../../config/autoload/{,*.}{global,local}.php', 
     ), 
     'module_paths' => array(
      'module', 
      'vendor', 
     ), 
    ), 
); 

<?php 
// module/Application/test/Bootstrap.php 

namespace ApplicationTest;//Change this namespace for your test 

use Zend\Loader\AutoloaderFactory; 
use Zend\Mvc\Service\ServiceManagerConfig; 
use Zend\ServiceManager\ServiceManager; 
use Zend\Stdlib\ArrayUtils; 
use RuntimeException; 

error_reporting(E_ALL | E_STRICT); 
chdir(__DIR__); 

class Bootstrap 
{ 
    protected static $serviceManager; 
    protected static $config; 
    protected static $bootstrap; 

    public static function init() 
    { 
     // Load the user-defined test configuration file, if it exists; otherwise, load 
     if (is_readable(__DIR__ . '/TestConfig.php')) { 
      $testConfig = include __DIR__ . '/TestConfig.php'; 
     } else { 
      $testConfig = include __DIR__ . '/TestConfig.php.dist'; 
     } 

     $zf2ModulePaths = array(); 

     if (isset($testConfig['module_listener_options']['module_paths'])) { 
      $modulePaths = $testConfig['module_listener_options']['module_paths']; 
      foreach ($modulePaths as $modulePath) { 
       if (($path = static::findParentPath($modulePath))) { 
        $zf2ModulePaths[] = $path; 
       } 
      } 
     } 

     $zf2ModulePaths = implode(PATH_SEPARATOR, $zf2ModulePaths) . PATH_SEPARATOR; 
     $zf2ModulePaths .= getenv('ZF2_MODULES_TEST_PATHS') ?: (defined('ZF2_MODULES_TEST_PATHS') ? ZF2_MODULES_TEST_PATHS : ''); 

     static::initAutoloader(); 

     // use ModuleManager to load this module and it's dependencies 
     $baseConfig = array(
      'module_listener_options' => array(
       'module_paths' => explode(PATH_SEPARATOR, $zf2ModulePaths), 
      ), 
     ); 

     $config = ArrayUtils::merge($baseConfig, $testConfig); 

     $serviceManager = new ServiceManager(new ServiceManagerConfig()); 
     $serviceManager->setService('ApplicationConfig', $config); 
     $serviceManager->get('ModuleManager')->loadModules(); 

     static::$serviceManager = $serviceManager; 
     static::$config = $config; 
    } 

    public static function getServiceManager() 
    { 
     return static::$serviceManager; 
    } 

    public static function getConfig() 
    { 
     return static::$config; 
    } 

    protected static function initAutoloader() 
    { 
     $vendorPath = static::findParentPath('vendor'); 

     if (is_readable($vendorPath . '/autoload.php')) { 
      $loader = include $vendorPath . '/autoload.php'; 
     } else { 
      $zf2Path = getenv('ZF2_PATH') ?: (defined('ZF2_PATH') ? ZF2_PATH : (is_dir($vendorPath . '/ZF2/library') ? $vendorPath . '/ZF2/library' : false)); 

      if (!$zf2Path) { 
       throw new RuntimeException('Unable to load ZF2. Run `php composer.phar install` or define a ZF2_PATH environment variable.'); 
      } 

      include $zf2Path . '/Zend/Loader/AutoloaderFactory.php'; 

     } 

     AutoloaderFactory::factory(array(
      'Zend\Loader\StandardAutoloader' => array(
       'autoregister_zf' => true, 
       'namespaces' => array(
        __NAMESPACE__ => __DIR__ . '/' . __NAMESPACE__, 
       ), 
      ), 
     )); 
    } 

    protected static function findParentPath($path) 
    { 
     $dir = __DIR__; 
     $previousDir = '.'; 
     while (!is_dir($dir . '/' . $path)) { 
      $dir = dirname($dir); 
      if ($previousDir === $dir) return false; 
      $previousDir = $dir; 
     } 
     return $dir . '/' . $path; 
    } 
} 

Bootstrap::init(); 

<?php 
// module/Application/test/ApplicationTest/Controller/IndexControllerTest.php 

namespace ApplicationTest\Controller; 

use ApplicationTest\Bootstrap; 
use Zend\Mvc\Router\Http\TreeRouteStack as HttpRouter; 
use Application\Controller\IndexController; 
use Zend\Http\Request; 
use Zend\Http\Response; 
use Zend\Mvc\MvcEvent; 
use Zend\Mvc\Router\RouteMatch; 
use PHPUnit_Framework_TestCase; 

class IndexControllerTest extends \PHPUnit_Framework_TestCase 
{ 
    protected $controller; 
    protected $request; 
    protected $response; 
    protected $routeMatch; 
    protected $event; 

    protected function setUp() 
    { 
     $serviceManager = Bootstrap::getServiceManager(); 
     $this->controller = new IndexController(); 
     $this->request = new Request(); 
     $this->routeMatch = new RouteMatch(array('controller' => 'index')); 
     $this->event  = new MvcEvent(); 
     $config = $serviceManager->get('Config'); 
     $routerConfig = isset($config['router']) ? $config['router'] : array(); 
     $router = HttpRouter::factory($routerConfig); 

     $this->event->setRouter($router); 
     $this->event->setRouteMatch($this->routeMatch); 
     $this->controller->setEvent($this->event); 
     $this->controller->setServiceLocator($serviceManager); 
    } 

    public function testIndexActionCanBeAccessed() 
    { 
     $this->routeMatch->setParam('action', 'index'); 

     $result = $this->controller->dispatch($this->request); 
     $response = $this->controller->getResponse(); 

     $this->assertEquals(200, $response->getStatusCode()); 
    } 
} 

回答

1

注入它在你的設置方法

protected function setUp() 
{ 
    // ... 
    $translator = new \Zend\I18n\Translator; 
    $this->controller = new IndexController($translator); 
    // .... 
}