簡體   English   中英

由於在null上調用成員函數,Zend框架PhpUnit測試錯誤

[英]Zend framework PhpUnit test error due to calling a member function on null

你好我是phpunit測試的新手,我被困在這里。

我已經按照本教程: Zend Framework 2:集中phpunit測試

之后我創建了一個模塊測試

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.......
    }
}
}

我收到此錯誤:

在/opt/lampp/htdocs/project/module/User/src/User/Service/ServiceProvider.php中調用null上的成員函數get()

請幫助這里缺少什么.. ??

所以我在這里注意到一些事情:

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:你的代碼似乎混合了doctrine和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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM