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上,我需要變得具體。

有趣的是知道這是爲什麼。如果有人可以向我解釋推理,那麼我可能會最終給你正確的答案;)

相關問題