2

我在Ubuntu 12.04下的单元测试Zend-Framework应用程序时遇到了问题。该项目的结构,而模型定义为以下ZF-Autoloader在Ubuntu上的UnitTests中不起作用

./application 
    ./models 
    ./DbTable 
     ./ProjectStatus.php (Application_Model_DbTable_ProjectStatus) 
    ./Mappers 
     ./ProjectStatus.php (Application_Model_Mapper_ProjectStatus) 
    ./ProjectStatus.php (Application_Model_ProjectStatus) 

这里的问题是与特定的Zend - 自动加载默认的Zend的应用程序。命名约定在这里出现,文件夹映射器加载所有类_Mapper但不是_Mappers。这是迄今为止的一些内部Zend行为。

在我的Windows机器上,phpunit运行时没有任何问题,试图启动所有这些类。

在我的Ubuntu机器但是与其上运行詹金斯,PHPUnit的未能找到合适的课程给我下面的错误出现

Fatal error: Class 'Application_Model_Mapper_ProjectStatus' not found 
in /var/lib/jenkins/jobs/PAM/workspace/tests/application/models/Mapper/ProjectStatusTest.php 
on line 39 

的错误真的是在Zend - 自动加载不从加载Ubuntu的机器,但我不知道如何或为什么这个工程。问题仍然存在,为什么这是。我想我已经仔细检查了与zend自动加载的东西的每一个接触点,但我无法弄清楚这一点。我会粘贴 - 从我的观点来看相关的片段 - 并希望你们中的任何人对此有所了解。

詹金斯片段为PHPUnit的

<target name="phpunit" description="Run unit tests with PHPUnit"> 
    <exec executable="phpunit" failonerror="true"> 
    <arg line="--configuration '${basedir}/tests/phpunit.xml' --coverage-clover '${basedir}/build/logs/clover.xml' --coverage-html '${basedir}/build/coverage/.' --log-junit '${basedir}/build/logs/junit.xml'" /> 
    </exec> 
</target> 

./tests/phpunit.xml

<phpunit bootstrap="./bootstrap.php"> 
    ... this shouldn't be of relevance ... 
</phpunit> 

./tests/bootstrap.php

<?php 
// Define path to application directory 
defined('APPLICATION_PATH') 
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application')); 

// Define application environment 
defined('APPLICATION_ENV') 
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'testing')); 

// Ensure library/ is on include_path 
set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . '/../library'), 
    get_include_path(), 
))); 

require_once 'Zend/Loader/Autoloader.php';  
Zend_Loader_Autoloader::getInstance(); 

任何帮助将不胜感激。

回答

2

我其实认为问题出在你的“models/Mappers”文件夹中。它应该是“models/mappers”(全部小写),并且可以解释为什么它可以在Windows而不是Linux上运行。

你可以从Zend_Application_Module_Autoloader类看:

$this->addResourceTypes(array(
      'dbtable' => array(
       'namespace' => 'Model_DbTable', 
       'path'  => 'models/DbTable', 
      ), 
      'mappers' => array(
       'namespace' => 'Model_Mapper', 
       'path'  => 'models/mappers', 
      ), 

然而,按我以前的答案,我仍然相信,您将需要引导的申请将被自动添加

+0

这就是它归结到的。 Windows是的,Unix没有应该让我直接不区分大小写......感谢您指出这一点。不,应用程序不需要在我的情况下引导。对于测试模型,不需要引导应用程序,自动加载器就足够了。对于测试控制器,我在测试之前引导应用程序以准备好干净的“孤独”应用程序。 **再次感谢!** – Sam

1

从ZF手册:

创建模型和数据库表

在我们开始之前,让我们考虑的东西:这里将这些类生活,以及如何将 我们找到他们呢?我们创建的默认项目实例化了一个 自动加载器。我们可以将其他自动加载器附加到它,以便它知道 哪里可以找到不同的类。通常,我们希望我们的各种MVC类别在同一棵树下分组 - 在这种情况下,应用程序/ - 并且通常使用通用前缀。

Zend_Controller_Front有一个“模块”的概念,它是个人的 迷你应用程序。模块模仿zf 工具在application /下设置的目录结构,其中的所有类都假设为 ,它们以一个通用前缀(模块名称)开头。应用程序/ 本身就是一个模块 - “默认”或“应用程序”模块。因此, 我们将要为此目录中的资源设置自动加载。

Zend_Application_Module_Autoloader提供了所需 到各个资源的模块下映射到相应的目录 的功能,并提供了一个标准的命名机制为好。在初始化 引导程序对象期间,默认创建一个 类的实例;您的应用程序引导默认使用 模块前缀“应用程序”。因此,我们的模型,表单和表 类都将以类前缀“Application_”开头。

由于Zend_Application_Module_Autoloader默认加载,你应该只需要引导你的应用程序(你没有运行前端控制器)按照例如在这个答案的。

如果你不想你的引导应用程序,你可以短路通过初始化Zend_Application_Module_Autoloader自己的资源加载:

$autoloader = new Zend_Application_Module_Autoloader(); 

正如你可以从代码中看到,这个类的__construct调用initDefaultResourceTypes( ),与所有的好东西你正在寻找:

class Zend_Application_Module_Autoloader extends Zend_Loader_Autoloader_Resource 
{ 
    /** 
    * Constructor 
    * 
    * @param array|Zend_Config $options 
    * @return void 
    */ 
    public function __construct($options) 
    { 
     parent::__construct($options); 
     $this->initDefaultResourceTypes(); 
    } 

    /** 
    * Initialize default resource types for module resource classes 
    * 
    * @return void 
    */ 
    public function initDefaultResourceTypes() 
    { 
     $basePath = $this->getBasePath(); 
     $this->addResourceTypes(array(
      'dbtable' => array(
       'namespace' => 'Model_DbTable', 
       'path'  => 'models/DbTable', 
      ), 
      'mappers' => array(
       'namespace' => 'Model_Mapper', 
       'path'  => 'models/mappers', 
      ), 
      'form' => array(
       'namespace' => 'Form', 
       'path'  => 'forms', 
      ), 
      'model' => array(
       'namespace' => 'Model', 
       'path'  => 'models', 
      ), 
      'plugin' => array(
       'namespace' => 'Plugin', 
       'path'  => 'plugins', 
      ), 
      'service' => array(
       'namespace' => 'Service', 
       'path'  => 'services', 
      ), 
      'viewhelper' => array(
       'namespace' => 'View_Helper', 
       'path'  => 'views/helpers', 
      ), 
      'viewfilter' => array(
       'namespace' => 'View_Filter', 
       'path'  => 'views/filters', 
      ), 
     )); 
     $this->setDefaultResourceType('model'); 
    } 
} 

要只引导您的应用程序,而无需运行前端控制器在测试/ bootstrap.php中:

<?php 
// Define path to application directory 
defined('APPLICATION_PATH') 
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application')); 

// Define application environment 
defined('APPLICATION_ENV') 
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'testing')); 

// Ensure library/ is on include_path 
set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . '/../library'), 
    get_include_path(), 
))); 

require_once 'Zend/Loader/Autoloader.php'; 

$config = array(
    APPLICATION_PATH . '/configs/application.ini' 
); 

// Create application, bootstrap, and run 
$application = new Zend_Application(
    APPLICATION_ENV, 
    array('config' => $config) 
); 

$application->bootstrap(); 
+0

所有默认资源不起作用。首先仍然需要启动Autoloader,但Mappers文件夹下的类未找到。但是我发现了一个即将添加的工作解决方案。然而,对于我为什么发生这种事情,我仍然是一个谜...... – Sam

0

由于传统的自动加载器没有工作,我试图手动做什么Zend应用程序会做什么。下面是最终

<?php  
// Define path to application directory 
defined('APPLICATION_PATH') 
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application')); 

// Define application environment 
defined('APPLICATION_ENV') 
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'testing')); 

// Ensure library/ is on include_path 
set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . '/../library'), 
    get_include_path(), 
))); 

require_once 'Zend/Loader/Autoloader.php'; 
require_once 'Zend/Loader/Autoloader/Resource.php'; 
$resources = new Zend_Loader_Autoloader_Resource(array(
    'namespace' => 'Application', 
    'basePath' => APPLICATION_PATH 
)); 

$resources->addResourceType('form','forms','Form'); 
$resources->addResourceType('model','models','Model'); 
$resources->addResourceType('dbtable','models/DbTable','Model_DbTable'); 
$resources->addResourceType('mapper','models/Mappers','Model_Mapper'); 

的逻辑通常是什么样的Zend应该弄清楚他自己制定了bootstrap.php。事实上,它在我的本地开发机器上运行在Windows上。但在Ubuntu上,我需要变得具体。

有趣的是知道这是为什么。如果有人可以向我解释推理,那么我可能会最终给你正确的答案;)

相关问题