2011-03-08 120 views
2

這是我的目錄結構phpunit測試類沒有發現錯誤,而類是在那裏?

application 
---modules 
------admin 
---------models 
-----------User.php 

這是我的用戶模型類

class admin_Model_User 
{ 
//User.php 
} 

這是我UserTest類具有簡單AssertType

class admin_Model_UserTest 
    extends PHPUnit_Framework_TestCase 
{ 
    public function testUserModel() 
    { 

     $testUser = new admin_Model_User(); 
      $this->assertType("admin_Model_User",$testUser); 
    } 
} 

當我運行這一點。我得到以下錯誤

[tests]# phpunit 

PHPUnit 3.5.13 by Sebastian Bergmann. 

0 
Fatal error: Class 'admin_Model_User' not found in /web/zendbase/tests/application/modules/admin/models/UserTest.php on line 18 

我知道那裏我必須有一些路徑設置。我真的無法弄清楚什麼是錯誤的。尋求幫助.....

+0

您是否包含類文件或設置自動加載器? – KingCrunch 2011-03-08 15:39:05

+0

是的,我在製作中的application.ini中定義了它。我不知道是否有其他方式來做這件事。我的應用程序工作正常。這意味着路徑可以。但是當我在Usertest類require_once中加入require_once「/web/zendbase/application/modules/admin/models/User.php」;單元測試運行良好。我應該在哪裏放置自動加載代碼,這樣phpunit也會自動加載庫。 – Developer 2011-03-08 16:00:27

回答

0

所有我需要做的就是這個

//file:ControllerTestCase.php 
<?php 
require_once GLOBAL_LIBRARY_PATH. '/Zend/Application.php'; 
require_once GLOBAL_LIBRARY_PATH. '/Zend/Test/PHPUnit/ControllerTestCase.php'; 

abstract class ControllerTestCase extends Zend_Test_PHPUnit_ControllerTestCase 
{ 
    protected $_application; 

    protected function setUp() 
    { 
     $this->bootstrap = array($this, 'appBootstrap'); 
     parent::setUp(); 
    } 

    public function appBootstrap() 
    { 
     $this->_application = new Zend_Application(APPLICATION_ENV, 
       APPLICATION_PATH . '/configs/application.ini' 
     ); 
     $this->_application->bootstrap(); 

     /** 
     * Fix for ZF-8193 
     * http://framework.zend.com/issues/browse/ZF-8193 
     * Zend_Controller_Action->getInvokeArg('bootstrap') doesn't work 
     * under the unit testing environment. 
     */ 
     $front = Zend_Controller_Front::getInstance(); 
     if($front->getParam('bootstrap') === null) { 
      $front->setParam('bootstrap', $this->_application->getBootstrap()); 
     } 
    } 
} 

//然後在引導require_once它的文件。 多數民衆贊成在所有:)它工作。

0

您需要在項目的PHPUnit bootstrap.php文件中引導Zend。即使您正在測試模型並因此不需要調度程序,您仍然必須使用Zend_Application加載application.ini並註冊其自動加載器。

您可以使用Zend_Test_PHPUnit_ControllerTestCase來代替引導,並確保您的模型測試在其中之一後運行,但這有點冒失。

另一個選項是require_once手動爲每個測試的模型類。這不能通過PHPUnit的自動加載器自動工作的原因是它不知道如何將「名稱空間」admin_Model轉換爲路徑admin/models

最後,您可以編寫一個簡單的autoloader來替換PHPUnit中的一個。在將下劃線轉換爲斜槓之前,請檢查該類是否以上面的「名稱空間」開頭,如果是,則替換它。

+0

我試圖實現自動加載器,但它甚至沒有選擇__autoload函數。你能給我一些實例嗎?通過在網上進行不同的搜索,我開始知道zend phpunit測試在構建自動加載機制時沒有。這真的很奇怪。 – Developer 2011-03-09 10:33:30

+0

@ user440771 - PHPUnit具有內置自動加載功能,Zend擁有'Zend_Loader_AutoLoader',但您需要自己做。我上面鏈接的頁面有很多創建複雜自動加載器的例子。如果您仍然需要知道,請發佈一個關於自動加載的新問題(忽略PHPUnit)。 – 2011-03-10 00:34:42