上课时,phpunit测试类没有找到错误?

时间:2011-03-08 15:34:47

标签: zend-framework 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

我知道我必须有一些路径设置。我真的无法弄清楚究竟是什么问题。寻求帮助.....

2 个答案:

答案 0 :(得分:0)

您需要在项目的PHPUnit bootstrap.php文件中引导Zend。即使您正在测试模型,因此不需要调度程序,您仍必须Zend_Application加载application.ini并注册其自动加载器。

您可以使用Zend_Test_PHPUnit_ControllerTestCase来进行引导,并确保您的模型测试在其中一个之后运行,但这有点笨拙。

另一个选择是为每个测试手动require_once模型类。这不能通过PHPUnit的自动加载器自动运行的原因是它不知道如何将“命名空间”admin_Model转换为路径admin/models

最后,您可以编写一个简单的autoloader来替换PHPUnit中的那个。在将下划线转换为斜杠之前,请检查类是否以上面的“命名空间”开头,如果是,则替换它。

答案 1 :(得分: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());
        }
    }
}

//然后在Bootstrap文件中require_once它。 多数民众赞成:)它正在运作。