2016-11-21 3 views
1

привет, новый тест phpunit, и я застрял здесь.Zend framework Ошибка проверки PhpUnit из-за вызова функции-члена по нуле

Я следовал этот учебник: Zend Framework 2 : Centralize phpunit test

После этого я создал тестовый модуль

namespace ModulesTests\ServiceProvidersTest\Model; 

use PHPUnit_Framework_TestCase; 
use ModulesTests\ServiceManagerGrabber; 
use User\Service\ServiceProvider; 
use Zend\ServiceManager\ServiceLocatorAwareInterface; 
use Zend\ServiceManager\ServiceLocatorAwareTrait; 
use Zend\Db\ResultSet\ResultSet; 
use Zend\Db\Adapter\Adapter; 
use Zend\Db\Sql\Sql; 

class TestServiceProviders extends PHPUnit_Framework_TestCase 
{ 
    protected $serviceManager; 
    protected $serviceprovider; 

public function setUp() 
{ 
    $serviceManagerGrabber = new ServiceManagerGrabber(); 
    $this->serviceManager = $serviceManagerGrabber->getServiceManager(); 
    $this->serviceprovider = new ServiceProvider() ; 
} 

public function testSPdetails() 
{ 
    $stack = array('1','2'); 
    $this->serviceprovider->getDetails($stack); 

} 
} 

В моем классе ServiceProvider

namespace User\Service; 
use Zend\ServiceManager\ServiceLocatorAwareInterface; 
use Zend\ServiceManager\ServiceLocatorAwareTrait; 
use Zend\Db\ResultSet\ResultSet; 
use Zend\Db\Adapter\Adapter; 
use Zend\Db\Sql\Sql; 

class ServiceProvider implements ServiceLocatorAwareInterface 
{ 
use ServiceLocatorAwareTrait; 


public function getModel() 
{ 
    $em = $this->getServiceLocator()-  >get('doctrine.entitymanager.orm_default'); 
    return $em->getRepository('User\Entity\ServiceProvider'); 
} 


public function getDetails($data = null,$fields='*') 
{ 
    $where = 1; 
    $company_ids = implode(',',$data); 
    if(isset($company_ids)){ 
     $where = 'sp.id IN('.$company_ids.')'; 
    } 
    if(isset($fields)){ 

    } 
    $db = $this->getServiceLocator()->get('Zend\Db\Adapter\Adapter'); 
    $query = 'some query'; 
    .....Rest code....... 
    } 
} 
} 

я получаю эту ошибку:

Ca Л.Л. к функции члена получим() на нуль в /opt/lampp/htdocs/project/module/User/src/User/Service/ServiceProvider.php

Пожалуйста, помогите, что я здесь отсутствует .. ??

+0

У меня такая же проблема, так как я переехал из Zendframework2 в Zendframework3 –

+1

Вы должны знать, ServiceLocatorAwareInterface является устарел и скоро будет удален из рамки, вероятно, лучше не использовать его :) – Andrew

ответ

0

Итак, есть несколько вещей, которые я замечаю здесь:

1: Вы не показали какой-либо код, показывающий, как вы подключили вашу службу к менеджеру службы, так что неясно, будет ли это когда-нибудь работать

2: вы непосредственно создать экземпляр класса, когда вам нужно использовать менеджер службы граббер вы написали

$this->serviceprovider = new ServiceProvider() ; 

становится

$serviceManagerGrabber = new ServiceManagerGrabber(); 
$this->serviceManager = $serviceManagerGrabber->getServiceManager(); 
$this->serviceprovider = $this->serviceManager->get('YOUR_SERVICE_KEY'); 

3: Вам, вероятно, следует начинать с модульных тестов, но не эти тесты интеграции модулей объясняются в этой статье. см https://framework.zend.com/manual/2.3/en/modules/zend.test.phpunit.html

4: ServiceLocatorAwareInterface осуждается вы, вероятно, следует использовать завод и ключ заводов менеджер службы конфигурации, чтобы ввести свои зависимости

5: Ваш код, кажется, смешивать учение и ZEND дб я не знаю почему вы сделали это, но мое предложение ... это плохая идея

Вот пример того, как вы могли бы поставить это вместе:

module.config.php

<?php 
namespace Application; 

return [ 
'service_manager' => [ 
    'factories' => [ 
     'ServiceProvider' => function ($serviceManager) { 
      // This shouldn't be in this anon function, it should be its own 
      // factory but I'm lazy and already writing loads of code for this example 
      // @see https://framework.zend.com/manual/2.4/en/in-depth-guide/services-and-servicemanager.html#writing-a-factory-class 
      $service = new \Application\Service\ServiceProvider(
       $serviceManager->get('doctrine.entitymanager.orm_default') 
      ); 

      return $service; 
     }, 
    ] 
], 
]; 

ServiceProvider.php

<?php 
namespace Application\Service; 

use Doctrine\ORM\EntityManager; 

class ServiceProvider 
{ 
    protected $entityManager; 

    public function __construct(EntityManager $entityManager) 
    { 
     $this->entityManager = $entityManager; 
    } 

    public function getModel() 
    { 
     return $this->entityManager- >getRepository('User\Entity\ServiceProvider'); 
    } 

    public function getDetails($data = null, $fields='*') 
    { 
     $serviceProviderRepository = $this->entityManager->getRepository('User\Entity\ServiceProvider'); 

     return $data; 
    } 
} 

ModuleTest тест

<?php 
namespace ModulesTests\Application\Service; 

use PHPUnit_Framework_TestCase; 
use ModulesTests\ServiceManagerGrabber; 

class ServiceProvidersTest extends PHPUnit_Framework_TestCase 
{ 
    protected $serviceManager; 
    protected $serviceprovider; 

    public function setUp() 
    { 
     $serviceManagerGrabber = new ServiceManagerGrabber(); 
     $this->serviceManager = $serviceManagerGrabber->getServiceManager(); 
     $this->serviceprovider = $this->serviceManager->get('ServiceProvider'); 
    } 

    public function testSPdetails() 
    { 
     $stack = array('1','2'); 
     $this->serviceprovider->getDetails($stack); 
    } 
} 

единица:

<?php 
namespace ModulesTests\Application\Service; 

use PHPUnit_Framework_TestCase; 
use Application\Service\ServiceProvider; 
use Prophecy\Argument; 

class ServiceProvidersUnitTest extends PHPUnit_Framework_TestCase 
{ 
    protected $entityManager; 
    protected $serviceprovider; 

    public function setUp() 
    { 
     $this->entityManager = $this->prophesize("Doctrine\\ORM\\EntityManager"); 
     $this->entityManager->getRepository(Argument::exact('User\Entity\ServiceProvider')) 
         ->willReturn(true); 
     $this->serviceprovider = new ServiceProvider($this->entityManager->reveal()); 
} 

    public function testSPdetails() 
    { 
     $stack = array('1','2'); 
     $this->serviceprovider->getDetails($stack); 
     $this->entityManager->getRepository(Argument::exact('User\Entity\ServiceProvider')) 
         ->shouldHaveBeenCalledTimes(1); 
    } 
} 

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

  • Нет связанных вопросов^_^