Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHPUnit自动加载类_Php_Yii_Phpunit_Autoload - Fatal编程技术网

PHPUnit自动加载类

PHPUnit自动加载类,php,yii,phpunit,autoload,Php,Yii,Phpunit,Autoload,简言之,问题 如何让自动加载程序找到运行PHP测试所需的所有类 详细问题 我想在Eclipse中自动加载我在PHPUnit中使用的类。我的目录结构如下 Project (called yii-app) protected dirA classA.php dirB classB.php yii-1.1.14.f0fee9 Yii.php tests ClassAT

简言之,问题

如何让自动加载程序找到运行PHP测试所需的所有类

详细问题

我想在Eclipse中自动加载我在PHPUnit中使用的类。我的目录结构如下

Project (called yii-app)
    protected
        dirA
            classA.php
        dirB
            classB.php
    yii-1.1.14.f0fee9
        Yii.php
    tests
        ClassATest.php
        ClassBTest.php
        bootstrap.php
        Autoloader.php
我使用我找到的
bootstrap.php
Autoloader.php
,详情见下文。类
classA
没有使用Yii框架,并且
ClassATest
中的测试运行顺利。类
classB
确实使用了Yii框架。第一行是:

Yii::import('application.<path into some directory>.*')
即使我注册了整个项目目录(包括子目录),也找不到Class
Yii
,而它就在那里。为了让这些测试也运行,我应该做些什么更改

注意

如果我试图直接从终端运行测试,我也会遇到同样的问题,因此它与Eclipse无关

$ ./composer/vendor/bin/phpunit --bootstrap=tests/bootstrap.php tests
PHPUnit 4.5.1 by Sebastian Bergmann and contributors.

Fatal error: Class 'Yii' not found in /Users/physicalattraction/git/yii-app/protected/dirB/classB.php on line 3
详细信息

Eclipse中的PHPUnit设置

bootstrap.php


Autoloader.php


自动加载器可能找不到YII类。您是否尝试添加:


Toolbox\Testing\AutoLoader::registerDirectory(DIR'/../yii-1.1.14.f0fee9/framework');

到bootstrap.php文件。我认为YII类是在framework目录中定义的

您可以尝试的另一件事是使用composer autoloader

附言
在tests目录中镜像应用程序目录/文件结构是一种很好的做法。在您的例子中,ClassATest.php和ClassBTest.php应该像在受保护的目录中一样分离到它们自己的目录中。

我发现,通过以下更改,它可以工作

具有以下目录结构

project
    protected
        config
            main.php
            test.php
        controllers
        models
        tests
            fixtures
            functional
            report
            unit
            bootstrap.php
            phpunit.xml
main.php
:添加Yii在其中查找类的目录。Yii不会自动搜索子目录,因此您必须在此处单独指定每个目录

// autoloading model and component classes
'import' => array(
    'application.models.*',
    'application.models.support.*',
    'application.components.*',
    ....
test.php
中定义以下测试配置

<?php
return CMap::mergeArray(
    require(dirname(__FILE__).'/main.php'),
    array(
        'components'=>array(
            'fixture'=>array(
                'class'=>'system.test.CDbFixtureManager',
            ),
            'db'=>array(
                'class' => 'CDbConnection',
                'connectionString' => 'CONNECTIONSTRING',
                'emulatePrepare' => true,
                'username' => 'USERNAME',
                'password' => 'PASSWORD',
                'charset' => 'utf8',
            ),
        ),
    )
);
?>
按照Yii和PHPUnit网站上的指示制作测试用例

class MyExportTest extends CDbTestCase
{
    public $fixtures = array(
        'orders' => 'Order'
    );

    public function test_order()
    {
        $order = $this->orders('order1');
        $this->assertTrue($order instanceof Order);
        $r = $order->order_number;
        $e = "on_101";
        $this->assertEquals($r, $e,
        sprintf("Received order_number: \n%s\nExpected order_number: \n%s\n", $r, $e));
    }

    public function test_export()
    {
        $sut = new MyExport($tenantId, $userGroupId);
        $r = $sut->method_to_test()
        $e = "expected result";
        $this->assertEquals($r, $e,
        sprintf("Received result: \n%s\nExpected result: \n%s\n", $r, $e));
    }
}

在我将文件
Yii.php
重命名为
Yii.php
之后,自动加载程序确实找到了Yii类。但是,即使尝试了Yii+第三方库自动加载器部分的建议,问题仍然存在:。感谢您对测试目录结构的实践。我还没想到,但这确实有道理。
// autoloading model and component classes
'import' => array(
    'application.models.*',
    'application.models.support.*',
    'application.components.*',
    ....
<?php
return CMap::mergeArray(
    require(dirname(__FILE__).'/main.php'),
    array(
        'components'=>array(
            'fixture'=>array(
                'class'=>'system.test.CDbFixtureManager',
            ),
            'db'=>array(
                'class' => 'CDbConnection',
                'connectionString' => 'CONNECTIONSTRING',
                'emulatePrepare' => true,
                'username' => 'USERNAME',
                'password' => 'PASSWORD',
                'charset' => 'utf8',
            ),
        ),
    )
);
?>
<?php
$yiit=__DIR__.'/../../yii-1.1.14.f0fee9/yiit.php';
$config=dirname(__FILE__).'/../config/test.php';
require_once($yiit);
// Include the following line if you want to write a WebTestCase
// require_once(dirname(__FILE__).'/WebTestCase.php');
Yii::createWebApplication($config);
?>
<?php    
return array(
    'order1' => array(
        'id' => 1011,
        'order_number' => 'on_101'
    )
);
?>
class MyExportTest extends CDbTestCase
{
    public $fixtures = array(
        'orders' => 'Order'
    );

    public function test_order()
    {
        $order = $this->orders('order1');
        $this->assertTrue($order instanceof Order);
        $r = $order->order_number;
        $e = "on_101";
        $this->assertEquals($r, $e,
        sprintf("Received order_number: \n%s\nExpected order_number: \n%s\n", $r, $e));
    }

    public function test_export()
    {
        $sut = new MyExport($tenantId, $userGroupId);
        $r = $sut->method_to_test()
        $e = "expected result";
        $this->assertEquals($r, $e,
        sprintf("Received result: \n%s\nExpected result: \n%s\n", $r, $e));
    }
}