首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >phpspec规则queryBuilder - mock

phpspec规则queryBuilder - mock
EN

Stack Overflow用户
提问于 2016-08-23 03:39:10
回答 1查看 663关注 0票数 0

我正在用PHPSpec 2.0.0编写一个测试,它将在Symfony应用程序中使用Doctrine query builder。这是我的班级:

代码语言:javascript
复制
class RedirectHandle
{
    /**
     * @var string
     */
    private $kernelEnvironment;

    /**
     * @var ContainerInterface
     */
    private $container;

    /**
     * RedirectHandle constructor.
     * @param $env
     * @param ContainerInterface $containerInterface
     */
    public function __construct($env, ContainerInterface $containerInterface)
    {
        $this->kernelEnvironment = $env;
        $this->container = $containerInterface;
    }

    public function handleUrl($url)
    {
        if ($this->kernelEnvironment === "dev") {
            $em = $this->container->get("doctrine")->getEntityManager();
            return $em->createQuery("SELECT a FROM module_redirect a WHERE url_from_redirect = :url ")
                ->setParameter('url', $url)
                ->getSingleScalarResult();
        }
        return false;
    }
}

下面是我的phpspec测试:

代码语言:javascript
复制
class RedirectHandleSpec extends ObjectBehavior
{
    function let($kernel,$container,$queryBuilder,$em,$redirectHandle)
    {
        $env = "dev";
        $kernel->beADoubleOf('Symfony\Component\HttpKernel\Kernel');
        $kernel->getEnvironment()->willReturn($env);
        $queryBuilder->beADoubleOf('Doctrine\ORM\QueryBuilder');
        $container->beADoubleOf('Symfony\Component\DependencyInjection\ContainerInterface');
        $redirectHandle->beADoubleOf('Kei\WebsiteBundle\Tools\Redirect\RedirectHandle');
        $em->beADoubleOf('Doctrine\ORM\EntityManager');
        $kernel->getContainer()->willReturn($container);
        $this->beConstructedWith($env,$container);
    }

    function it_is_initializable()
    {
        $this->shouldHaveType('Kei\WebsiteBundle\Tools\Redirect\RedirectHandle');
    }

    function it_is_init_redirect_when_env_is_dev($container,$queryBuilder,$em)
    {
       $container->get("doctrine")->willReturn($queryBuilder);
       $em->createQuery(Argument::any())->willReturn($em);
       $this->handleUrl("test")->shouldBeReturn(true);
    }
}

当我运行测试时,我得到了以下错误:

代码语言:javascript
复制
1PHP Fatal error:  Uncaught Error: Call to a member function createQuery() on null in /var/www/kei-site/src/Kei/WebsiteBundle/Tools/Redirect/RedirectHandle.php:37
Stack trace:
#0 [internal function]: Kei\WebsiteBundle\Tools\Redirect\RedirectHandle->handleUrl('test')
#1 /var/www/kei-site/vendor/phpspec/phpspec/src/PhpSpec/Wrapper/Subject/Caller.php(260): call_user_func_array(Array, Array)
#2 /var/www/kei-site/vendor/phpspec/phpspec/src/PhpSpec/Wrapper/Subject/Caller.php(97): PhpSpec\Wrapper\Subject\Caller->invokeAndWrapMethodResult(Object(Kei\WebsiteBundle\Tools\Redirect\RedirectHandle), 'handleUrl', Array)
#3 /var/www/kei-site/vendor/phpspec/phpspec/src/PhpSpec/Wrapper/Subject.php(187): PhpSpec\Wrapper\Subject\Caller->call('handleUrl', Array)
#4 [internal function]: PhpSpec\Wrapper\Subject->__call('handleUrl', Array)
#5 /var/www/kei-site/vendor/phpspec/phpspec/src/PhpSpec/ObjectBehavior.php(136): call_user_func_array(Array, Array)
#6 /var/www/kei-site/spec/Kei/WebsiteBundle/Tools/Redirect/RedirectHandleSpec.php(40): PhpSpec\Obj in /var/www/kei-site/src/Kei/WebsiteBundle/Tools/Redirect/RedirectHandle.php on line 37

我应该怎么做才能解决这个问题?

EN

回答 1

Stack Overflow用户

发布于 2016-08-23 05:00:13

代码语言:javascript
复制
class RedirectHandle
{
    /**
     * @var string
     */
    private $kernelEnvironment;
    /**
     * @var
     */
    private $container;

    /**
     * RedirectHandle constructor.
     * @param $env
     * @param ContainerInterface $containerInterface
     */
    public function __construct($env,ContainerInterface $containerInterface)
    {
        $this->kernelEnvironment = $env;
        $this->container = $containerInterface;
    }

    /**
     *
     */
    public function handleUrl($url)
    {

        if ($this->kernelEnvironment === "dev") {
            $em = $this->container->get("doctrine")->getEntityManager();
            $query = $em->createQuery("SELECT a FROM KeiWebsiteBundle:Carrier a");
            return true;
        }
        return false;
    }
}

重构后的Phpspec代码:

类RedirectHandleSpec扩展了ObjectBehavior {

代码语言:javascript
复制
function let($kernel,$container,$queryBuilder,$em)
{
    $env = "dev";
    $kernel->beADoubleOf('Symfony\Component\HttpKernel\Kernel');
    $queryBuilder->beADoubleOf('Doctrine\ORM\QueryBuilder');
    $container->beADoubleOf('Symfony\Component\DependencyInjection\ContainerInterface');
    $em->beADoubleOf('Doctrine\ORM\EntityManager');
    $this->beConstructedWith($env,$container);
}
function it_is_initializable()
{
    $this->shouldHaveType('Kei\WebsiteBundle\Tools\Redirect\RedirectHandle');
}

/**
 * Przekierowuje strone jesli srodowisko jest dev
 */
function it_is_init_redirect_when_env_is_dev($container,$queryBuilder,$em)
{
    $container->get("doctrine")->willReturn($queryBuilder);
    $em->createQuery(Argument::any())->willReturn(new Query($em->getWrappedObject()));
    $this->handleUrl("test");
}

}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39087448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档