Php 如何在Phalcon单元测试中引导依赖注入服务?

Php 如何在Phalcon单元测试中引导依赖注入服务?,php,unit-testing,phpunit,phalcon,Php,Unit Testing,Phpunit,Phalcon,我查阅了Phalcon的文件,找到了PHPUnit并开始工作。但是,我无法将现有服务引导到单元测试框架中 目前,我在/public/index.php中加载配置、路由和服务。例如,我正在加载会话库: $di->set( 'session', function () use ( $config ) { $session = new Phalcon\Session\Adapter\Redis( ... config ...

我查阅了Phalcon的文件,找到了PHPUnit并开始工作。但是,我无法将现有服务引导到单元测试框架中

目前,我在
/public/index.php
中加载配置、路由和服务。例如,我正在加载会话库:

$di->set(
    'session',
    function () use ( $config ) {
        $session = new Phalcon\Session\Adapter\Redis(
            ... config ...
        );
    });
现在,在我的应用程序中,我有了调用
$this->session->get('user\u id')
的代码来使用会话库。我有很多这样的服务——一个用于SQL、MongoDB、cookies等

我遇到的问题是将这些服务正确加载到单元测试类中。Phalcon文档建议在UnitTestCase类()中加载我的DI服务,但我真的不想在这个类加载程序中重新定义相同的服务。此外,我希望以相同的方式使用应用程序中的组件;这些组件依赖于延迟加载的服务

因此,为了尝试这样做,我在我的单元测试
TestHelper.php
init脚本中包含了相同的
/app/config/services.php
文件,认为我可以使用相同的$di对象。这是因为我的测试用例可以调用
$This->di->getSession()->>get('var')
,但只要我的应用程序中的组件尝试调用
$This->session->get('var')
,它就会抛出一个错误:

1) Libraries\SessionTest::testGetSet
Undefined property: Libraries\SessionTest::$session

/home/mike/PhalconProject/app/library/Session.php:25
/home/mike/PhalconProject/tests/libraries/SessionTest.php:13
此错误告诉我,我的应用程序会话管理库
session.php
在通过依赖项注入器访问
$This->session->
时失败


有没有什么我根本上做错了?我需要在单元测试类中重新定义服务吗?如果我确实需要重新定义它们,我的应用程序是否能够加载其服务?

因此,这里的解决方案似乎是构建应用程序库以静态访问DI服务

第一步是在
/public/index.php
/tests/bootstrap.php
中设置默认DI:

\Phalcon\DI::setDefault( $di );
现在,在应用程序库中(如
/app/Library/Auth.php
/app/Library/Session.php
)静态访问服务():

为了使这更容易,我建立了一个基本库,我的所有应用程序库都扩展了它。基本库有一个简化此调用的方法

namespace Base;

use \Phalcon\DI as DI;

class Library extends \Phalcon\Mvc\User\Component
{
    public function getService( $service )
    {
        $func = "get". ucfirst( $service );
        return DI::getDefault()->$func();
    }
}
最后,
/app/Library/Session.php
将扩展这个
\Base\Library
类,每当我需要方法中的会话服务时,我可以调用:

$session = self::getService( 'session' );

我已经使用简单的PHPUnit bootstrap.php文件(查看PHPUnit的
--bootstrap
选项)注入了我的所有Phalcon服务(通常通过调用DI对象获得)我的bootstrap.php内容是:

<?php

require_once(__DIR__ . '/../app/config/local_config.php');
$config = include __DIR__ . "/../app/config/config.php";
/**
 * Read auto-loader
 */
include __DIR__ . "/../app/config/loader.php";

/**
 * Read services
 */
include __DIR__ . "/../app/config/services.php";

<?php

require_once(__DIR__ . '/../app/config/local_config.php');
$config = include __DIR__ . "/../app/config/config.php";
/**
 * Read auto-loader
 */
include __DIR__ . "/../app/config/loader.php";

/**
 * Read services
 */
include __DIR__ . "/../app/config/services.php";