Zend Framework 2控制器插件在单元测试中不可用

时间:2012-10-31 00:13:01

标签: zend-framework2

嗨,我是Zend的新人,并被要求与Z2一起开发。我试图通过控制器插件添加可重用的功能,但我没有成功进行单元测试。它在常规应用程序中运行良好。

// 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

1 个答案:

答案 0 :(得分: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();
    }
}

您可以将setInvokableClass()替换为setService(),例如注入模拟。