2015-09-28 2 views
1

Вот Фабрика:Как насмехаться ServiceLocator ZF2?

namespace Maintenance\Factory\View\Helper; 

use Zend\ServiceManager\FactoryInterface; 
use Zend\ServiceManager\ServiceLocatorInterface; 
use Maintenance\View\Helper\SousMenuContrat; 

class SousMenuContratFactory implements FactoryInterface 
{ 
    public function createService(ServiceLocatorInterface $serviceLocator) 
     { 
      $realServiceLocator = $serviceLocator->getServiceLocator(); 

      $maiContratService = $realServiceLocator->get(
       'Maintenance\Service\Model\FMaiContratService' 
      ); 

      return new SousMenuContrat(
       $maiContratService 
      ); 
     } 
    } 

я должен написать несколько тестов PHPUnit, я начал делать так:

public function testCreateService() 
    { 
     $this->mockDriver = $this->getMock('Zend\Db\Adapter\Driver\DriverInterface'); 
     $this->mockConnection = $this->getMock('Zend\Db\Adapter\Driver\ConnectionInterface'); 
     $this->mockDriver->expects($this->any())->method('checkEnvironment')->will($this->returnValue(true)); 
     $this->mockDriver->expects($this->any())->method('getConnection')->will($this->returnValue($this->mockConnection)); 
     $this->mockPlatform = $this->getMock('Zend\Db\Adapter\Platform\PlatformInterface'); 
     $this->mockStatement = $this->getMock('Zend\Db\Adapter\Driver\StatementInterface'); 
     $this->mockDriver->expects($this->any())->method('createStatement')->will($this->returnValue($this->mockStatement)); 
     $this->adapter = new Adapter($this->mockDriver, $this->mockPlatform); 
     $this->sql = new Sql($this->adapter); 


     $mockTableGateway = $this->getMock('Zend\Db\TableGateway\TableGateway', array(), array(), '', false); 

     $maiContratTable = $this->getMockBuilder('Maintenance\Model\BDD\FMaiContratTable') 
      ->setMethods(array()) 
      ->setConstructorArgs(array($mockTableGateway, $this->adapter, $this->sql)) 
      ->getMock(); 


     $smMock = $this->getMockBuilder('Zend\ServiceManager\ServiceManager') 
         ->setMethods(array('get')) 
         ->getMock(); 

     $smMock->expects($this->at(0)) 
      ->method('get') 
      ->with('Maintenance\Service\Model\FMaiContratService') 
      ->will($this->returnValue(new FMaiContratService($maiContratTable))); 

     $factory = new SousMenuContratFactory(); 
     $runner = $factory->createService($smMock); 
    } 

Но у меня некоторые проблемы. Это говорит мне:

Призыв к неопределенному методу Mock_ServiceManager_3ed93deb :: getServiceLocator()

Что я неправильно понял?

Спасибо!

ответ

2

В вашем заводе вы звоните:

$realServiceLocator = $serviceLocator->getServiceLocator(); 

Но вы определили:

$smMock->expects($this->at(0)) 
     ->method('get') 

этому ServiceLocator передается на ваш завод, как правило, не имеет метод getServiceLocator, потому что уже есть служба поиска. (Edit: Царапина, что, PluginManagers сделать) Вместо этого используйте:

public function createService(ServiceLocatorInterface $serviceLocator) 
{ 
    $maiContratService = $serviceLocator->get(
     'Maintenance\Service\Model\FMaiContratService' 
    ); 

    return new SousMenuContrat(
     $maiContratService 
    ); 
} 

Edit: Plugin фабрики другое дело, вот тестовый код:

public function testCreateService() 
{ 
    $maiContractServiceMock = $this->getMockBuilder('Maintenance\Service\Model\FMaiContratService') 
     ->disableOriginalConstructor() 
     ->getMock(); 
    // if you do something with FMaiContratService in the constructor of SousMenuContrat, 
    // mock more methods here 

    $smMock = $this->getMockBuilder('Zend\ServiceManager\ServiceManager') 
     ->setMethods(array('get')) 
     ->getMock(); 
    $smMock->expects($this->at(0)) 
     ->method('get') 
     ->with('Maintenance\Service\Model\FMaiContratService') 
     ->will($this->returnValue($maiContractServiceMock)); 

    $hpmMock = $this->getMockBuilder('Zend\View\HelperPluginManager') 
     ->setMethods(array('getServiceLocator')) 
     ->getMock(); 
    $hpmMock->expects($this->any()) 
     ->method('getServiceLocator') 
     ->will($this->returnValue($smMock)); 

    $factory = new SousMenuContratFactory(); 
    $runner = $factory->createService($hpmMock); 
} 

В этом случае вам нужно макет диспетчера плагинов, возвращающий другой сервисный локатор, если вызывается getServiceLocator. Desole!

+0

Если я использую $ serviceLocator-> get ('Maintenance ...'), это не сработает ... – Amelie

+0

Это спрашивает меня аргументы FMaiContratService, но я действительно не вызываю FMaiContratService, я вызываю Factory, который звонит FMaiContratService (через ServiceManager) ... – Amelie

+0

Я не уверен, если я приведу вас сюда, он отлично работает для меня, и я не получаю сообщение об ошибке. Вы получаете ошибку, потому что макет, который вы передали 'createService()', не знал о методе 'getServiceLocator()' - это хорошо, потому что ServiceLocatorInterface не содержит такого метода. И метод 'get ('Maintenance \ ...')' возвращает требуемый экземпляр 'FMaiContratService', не так ли? – StoryTeller

Смежные вопросы