Вот Фабрика:Как насмехаться 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()
Что я неправильно понял?
Спасибо!
Если я использую $ serviceLocator-> get ('Maintenance ...'), это не сработает ... – Amelie
Это спрашивает меня аргументы FMaiContratService, но я действительно не вызываю FMaiContratService, я вызываю Factory, который звонит FMaiContratService (через ServiceManager) ... – Amelie
Я не уверен, если я приведу вас сюда, он отлично работает для меня, и я не получаю сообщение об ошибке. Вы получаете ошибку, потому что макет, который вы передали 'createService()', не знал о методе 'getServiceLocator()' - это хорошо, потому что ServiceLocatorInterface не содержит такого метода. И метод 'get ('Maintenance \ ...')' возвращает требуемый экземпляр 'FMaiContratService', не так ли? – StoryTeller