2012-10-31 16 views
5

Xin chào một người mới đến với Zend và đã được yêu cầu phát triển với Z2. Tôi đang cố gắng để thêm chức năng tái sử dụng thông qua các plugin điều khiển, nhưng tôi không có thành công với các bài kiểm tra đơn vị. Nó hoạt động tốt bên trong ứng dụng thông thường.Plug-in điều khiển Zend Framework 2 không khả dụng trong các bài kiểm tra đơn vị

// 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ỗi tôi nhận được là:

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

Trả lời

12

Nếu bạn tạo một thử nghiệm đơn vị cho một bộ điều khiển, bạn kiểm tra bộ điều khiển trong một, đơn vị kiểm soát chuyên dụng. Bạn không khởi tạo ứng dụng, bạn không nạp các mô-đun và bạn không phân tích cú pháp tệp cấu hình hoàn chỉnh.

Để đơn vị kiểm tra bộ điều khiển, hãy thêm chính plugin đó theo phương pháp setUp() để đặt nó trực tiếp không thể trực tiếp trong trình quản lý dịch vụ. Nếu bạn muốn kiểm tra xem cấu hình của bạn có hoạt động hay không, bạn đang xem xét kiểm tra chức năng. Hãy thử khởi động lại ứng dụng hoàn chỉnh trước và sau đó kiểm tra trình điều khiển của bạn bằng cách tạo một yêu cầu và xác nhận phản hồi.

Bởi các xét nghiệm chức năng là khó khăn hơn một chút để giải quyết, đó là dễ dàng hơn để bắt đầu với bộ điều khiển (plug-in) để kiểm tra trong một thử nghiệm đơn vị:

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

Bạn có thể thay setInvokableClass() bởi setService() để tiêm một mô hình ví dụ .

+0

Cảm ơn bạn rất nhiều !!! Điều đó đã giết chết tôi! –

+0

Đây là một câu trả lời cổ xưa, nhưng trong trường hợp bạn vẫn còn ở quanh Jurian, hoặc những người khác tìm thấy câu trả lời này ... ngay khi bạn gọi $ this-> controller-> indexAction() Tôi nghĩ bạn đang gặp rắc rối vì nó có khả năng rằng một hành động điều khiển sẽ gọi một cái gì đó từ lớp AbstractActionController mà bộ điều khiển kế thừa từ đó. Không khởi tạo khung công tác, không làm việc. –

+0

Không cần phải là Greg, nếu indexAction của bạn không chứa các lời gọi đến bất kỳ phương thức trừu tượng nào, tất cả đều ổn. –

Các vấn đề liên quan