Php 如何在Phalcon单元测试中引导依赖注入服务?
我查阅了Phalcon的文件,找到了PHPUnit并开始工作。但是,我无法将现有服务引导到单元测试框架中 目前,我在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 ...
/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";