2011-03-08 61 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