【问题标题】:Problems with Unit test on symfonysymfony 上的单元测试问题
【发布时间】:2018-12-28 14:01:32
【问题描述】:

)

自从我对查询进行单元测试两天以来,我遇到了一些问题,这里是代码和测试:

请求:

<?php

namespace CampaignBundle\Service;

use Doctrine\ORM\EntityManager;
use AccessBundle\Model\UserInterface;
use AccessBundle\Service\CountryFilter;

class CampaignProvider
{
    /** @var EntityManager */
    protected $em;

    /** @var CountryFilter */
    protected $countryFiler;

    /**
     * CampaignProvider constructor.
     * @param EntityManager $entityManager
     * @param CountryFilter $countryFilter
     */
    public function __construct(EntityManager $entityManager, CountryFilter $countryFilter)
    {
        $this->em = $entityManager;
        $this->countryFiler = $countryFilter;
    }

    /**
     * @return \Doctrine\ORM\EntityRepository|CampaignBundle\Entity\CampaignRepository
     */
    protected function getRepository()
    {
        return $this->em->getRepository('CampaignBundle:Campaign');
    }

    /**
     * @return array
     * @throws \Exception
     */
    public function getCampaign()
    {
        $queryBuilder = $this->getCampaignQb();

        return $queryBuilder->getQuery()->getResult();
    }

    /**
     * @return \Doctrine\ORM\QueryBuilder
     * @throws \Exception
     */
    public function getCampaignQb()
    {
        $repository = $this->getRepository();

        $queryBuilder = $repository->createQueryBuilder('c');

        $queryBuilder
            ->where('c.isDeleted = 0')
            ->addOrderBy('c.id', 'DESC');

        return $queryBuilder;
    }
}

测试:

<?php
/**
 * Created by PhpStorm.
 * User: mickael
 * Date: 24/12/18
 * Time: 14:10
 */

namespace CampaignBundle\Tests\Service;

use Doctrine\ORM\AbstractQuery;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\EntityRepository;
use AccessBundle\Service\CountryFilter;
use CampaignBundle\Entity\Campaign;
use CampaignBundle\Service\CampaignProvider;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;

class CampaignProviderTest extends KernelTestCase
{
    /** @var EntityManager */
    private $entityManager;

    /** @var CampaignProvider */
    private $campaignProvider;

    /** @var CountryFilter */
    private $countryFilter;

    /** @var TokenStorageInterface */
    private $tokenStorage;

    /** @var AuthorizationCheckerInterface */
    private $authorizationChecker;

    public function setUp()
    {
        $this->entityManager = $this->getMockBuilder('\Doctrine\ORM\EntityManager')
            ->disableOriginalConstructor()
            ->getMock();

        $this->tokenStorage = $this->getMockBuilder('Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface')
            ->disableOriginalConstructor()
            ->getMock();

        $this->authorizationChecker = $this->getMockBuilder('Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface')
            ->disableOriginalConstructor()
            ->getMock();

        $this->countryFilter = new CountryFilter($this->tokenStorage, $this->authorizationChecker, $this->entityManager);

        $this->campaignProvider = new CampaignProvider($this->entityManager, $this->countryFilter);
    }

    public function testGetCampaign()
    {
        $queryBuilder = $this->getMockBuilder('Doctrine\ORM\QueryBuilder')
            ->setMethods(array('getQuery', 'getCampaignQb'))
            ->disableOriginalConstructor()
            ->getMock();

        $queryBuilder->expects($this->once())
            ->method('getCampaignQb')
            ->will($this->returnValue($queryBuilder));

        $queryBuilder->expects($this->once())
            ->method('getQuery')
            ->will($this->returnValue($queryBuilder));

        $queryBuilder->expects($this->once())
            ->method('getResult')
            ->will($this->returnValue($queryBuilder));

        $this->campaignProvider->getCampaign();
    }

    public function testGetCampaignQb()
    {
        $repository = $this->getMockBuilder('\Doctrine\ORM\EntityRepository')
            ->disableOriginalConstructor()
            ->setMethods(array('createQueryBuilder'))
            ->getMock();

        $queryBuilder = $this->getMockBuilder('Doctrine\ORM\QueryBuilder')
            ->setMethods(array('where', 'addOrderBy', 'createQueryBuilder'))
            ->disableOriginalConstructor()
            ->getMock();

        $repository->expects($this->once())
            ->method('createQueryBuilder')
            ->will($this->returnValue($queryBuilder));

        $queryBuilder->expects($this->once())
            ->method('where')
            ->will($this->returnValue($queryBuilder));

        $queryBuilder->expects($this->once())
            ->method('addOrderBy')
            ->will($this->returnValue($queryBuilder));

        $entityManager = $this->getMockBuilder('\Doctrine\ORM\EntityManager')
            ->disableOriginalConstructor()
            ->getMock();

        $entityManager->expects($this->once())
            ->method('getRepository')
            ->will($this->returnValue($repository));

        $this->campaignProvider->getCampaignQb();
    }
}

当我运行测试时,我得到:

PHP Fatal error:  Call to a member function createQueryBuilder() on null in

我承认我在测试查询时遇到了一些问题,你能帮我吗?

谢谢;)

编辑: 编辑我的所有帖子

ps:CountryFilter 是我在 CampaignProvider 中调用的一项服务

【问题讨论】:

  • 您是否在实体 1 中声明了存储库类?
  • 你好,是的,我做到了(我编辑了我的帖子以显示我也是如何获得存储库的)
  • 你能把整个课程都过去吗!不仅仅是方法。谢谢!
  • 我再次编辑抱歉

标签: php unit-testing symfony doctrine


【解决方案1】:

您在模拟实体管理器,但您没有在测试中将其传递给 CampaignProvider:$this-&gt;campaignProvider 不知道本地 $entityManager 变量。

如果您正在使用构造函数注入,则需要将其放入构造函数调用中;如果您正在使用方法注入,则需要将其放入 setEntityManager 方法中。

【讨论】:

  • 你好,通常我是在测试课的设置中完成的,我编辑了我的帖子你现在可以看到它
  • 在您的测试中,您仍在使用局部变量($repository$entityManager),但您应该使用在 setUp 函数中创建的变量($this-&gt;repository 和 @ 987654328@)。您不必为它们创建新的模拟。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
  • 2019-06-04
  • 2019-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-23
相关资源
最近更新 更多