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

でヌルのメンバ関数のget()へのLL ...?

1:

+0

私はZendframework2からZendframework3 –

+1

に移動するので、私は同じ問題を抱えているあなたは注意してくださいServiceLocatorAwareInterfaceあるべきです廃止され、すぐにフレームワークから削除されます。恐らくそれを使用しないことをお勧めします:) – Andrew

答えて

0

は、だから私はここに気づくがいくつかありますあなたはサービスマネージャにあなたのサービスをフックアップしているかを示す任意のコードを示していないので、これが今まで

を動作するかどうかは不明です

は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 DBを混ぜているようだ、私は知りませんあなたはこれをやったが、私の提案は、それはここで

は、あなたが一緒にこれを置くかもしれない方法の一例である悪い考えだ...である理由:

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); 
    } 
} 
関連する問題