单元测试CakePHP 3插件需要一个config / routes.php文件夹来测试Router :: url()

时间:2017-09-17 03:14:50

标签: php unit-testing cakephp routes

我正在为CakePHP 3插件编写一些测试,我的一些操作使用Router::url调用。当我运行phpunit时,我收到以下错误:include([project dir]\\config\routes.php): failed to open stream: No such file or directory

我想知道的是,这个文件是否真的只需要进行单元测试。如果我在该文件夹上创建文件,则测试工作正常。我试过添加

DispatcherFactory::add('Asset'); DispatcherFactory::add('Routing'); DispatcherFactory::add('ControllerFactory');

到我的tests/bootstrap.php文件,但它根本没有变化。

由于这是一个独立的插件,我发现有一个带有config文件的routes.php文件夹有点奇怪,仅用于测试。这有什么解决方法吗?

1 个答案:

答案 0 :(得分:1)

路由器要求在应用程序级别上存在routes.php文件,因此您应该做的是配置一个可以放置此类文件的测试应用程序环境。

tests/bootstrap.php文件中,定义测试环境所需的常量和配置。如果它只适用于路由器,那么如果您相应地定义CONFIG常量就足够了,这在\Cake\Routing\Router::_loadRoutes()中使用,如

define('CONFIG', dirname(__DIR__) . DS . 'tests' . DS . 'TestApp' . DS . 'config' . DS);

这会将配置目录设置为tests/TestApp/config/,您可以在其中放置routes.php文件。

通常我建议设置所有常量,至少是基本的应用程序配置,这是我的一个插件的示例:

use Cake\Core\Configure;
use Cake\Core\Plugin;

if (!defined('DS')) {
    define('DS', DIRECTORY_SEPARATOR);
}
define('ROOT', dirname(__DIR__));
define('APP_DIR', 'src');
define('APP_ROOT', ROOT . DS . 'tests' . DS . 'TestApp' . DS);
define('APP', APP_ROOT . APP_DIR . DS);
define('CONFIG', APP_ROOT . DS . 'config' . DS);
define('WWW_ROOT', APP . DS . 'webroot' . DS);
define('TESTS', ROOT . DS . 'tests' . DS);
define('TMP', APP_ROOT . DS . 'tmp' . DS);
define('LOGS', APP_ROOT . DS . 'logs' . DS);
define('CACHE', TMP . 'cache' . DS);
define('CAKE_CORE_INCLUDE_PATH', ROOT . DS . 'vendor' . DS . 'cakephp' . DS . 'cakephp');
define('CORE_PATH', CAKE_CORE_INCLUDE_PATH . DS);
define('CAKE', CORE_PATH . 'src' . DS);

require_once ROOT . DS . 'vendor' . DS . 'autoload.php';
require_once CORE_PATH . 'config' . DS . 'bootstrap.php';

$config = [
    'debug' => true,

    'App' => [
        'namespace' => 'App',
        'encoding' => 'UTF-8',
        'defaultLocale' => 'en_US',
        'base' => false,
        'baseUrl' => false,
        'dir' => 'src',
        'webroot' => 'webroot',
        'wwwRoot' => WWW_ROOT,
        'fullBaseUrl' => 'http://localhost',
        'imageBaseUrl' => 'img/',
        'cssBaseUrl' => 'css/',
        'jsBaseUrl' => 'js/',
        'paths' => [
            'plugins' => [APP_ROOT . 'plugins' . DS],
            'templates' => [APP . 'Template' . DS],
            'locales' => [APP . 'Locale' . DS],
        ],
    ]
];
Configure::write($config);

date_default_timezone_set('UTC');
mb_internal_encoding(Configure::read('App.encoding'));
ini_set('intl.default_locale', Configure::read('App.defaultLocale'));

Plugin::load('MyPlugin', ['path' => ROOT]);