簡體   English   中英

通過PSR-0自動加載類

[英]Autoloading class via PSR-0

我有以下目錄結構

oop
 - src
   - FetchTask.php
 - tests
   - FetchTaskTest.php
 - vendor
 - composer.json
 - composer.lock
 - phpunit.xml

// FetchTask.php

<?php 

namespace PHPUnitTuts;

class FetchTask 
{

}

// FetchTaskTest.php

<?php

use PHPUnitTuts\FetchTask;

class Fetch_Test extends AbstractTest
{
    public function setUp() 
    {
        $this->fetch = new FetchTask;
    }

    public function testStoresListOfAssets($value='')
    {
        $this->classHasStaticAttribute('paths', 'FetchTask');
    }
}

// composer.json

{
    "name": "raheel/code",
    "require-dev": {
        "phpunit/phpunit": "^5.5",
        "phpunit/php-code-coverage": "^4",
        "squizlabs/php_codesniffer": "2.*"
    },
    "autoload": {
        "psr-0": { 
            "PHPUnitTuts\\": "src/" 
        }
    },
}

// phpunit.xml

<phpunit bootstrap="./vendor/autoload.php">
    <testsuites>
        <testsuite name="oop">
             <directory>./tests</directory>
        </testsuite>
    </testsuites>
</phpunit>

現在,當我運行$ vendor/bin/phpunit它說

PHP致命錯誤:在第9行的/home/raheel/code/oop/tests/FetchTaskTest.php中找不到類'PHPUnitTuts \\ FetchTask'

請指教我在做什么錯。 謝謝

我猜缺少測試的聲明,可以將其放在autoload-dev塊中:

{
    "name": "raheel/code",
    "require-dev": {
        "phpunit/phpunit": "^5.5",
        "phpunit/php-code-coverage": "^4",
        "squizlabs/php_codesniffer": "2.*"
    },
    "autoload": {
        "psr-0": { 
            "PHPUnitTuts\\": "src/" 
        }
    },
    "autoload-dev": {
        "psr-0": { 
            "Tests\\PHPUnitTuts\\": "tests/" 
        }
    },
}

然后,您的測試應該位於Tests名稱空間中。

use Tests\PHPUnitTuts\FetchTask

對於PSR-0,必須更改文件夾結構,將類移動到文件夾PHPUnitTuts中:

oop
 - src
   - PHPUnitTuts/FetchTask.php
 - tests
   - PHPUnitTuts/FetchTaskTest.php
 - vendor
 - composer.json
 - composer.lock
 - phpunit.xml

順便說一句,PSR-0已過時,為什么不使用PSR-4?

您正在混合PSR-0和PSR-4的概念。

使用PSR-0

src/FetchTask.php移至src/PHPUnitTuts/FetchTask.php

使用PSR-4

更改

"psr-0": { 
    "PHPUnitTuts\\": "src/" 
}

"psr-4": { 
    "PHPUnitTuts\\": "src" 
}

建議的結構

.
├── composer.json
├── phpunit.xml.dist
├── src
│   └── FetchTask.php
└── test
    └── FetchTaskTest.php

composer.json

{
    "name": "raheel/code",
    "require-dev": {
        "phpunit/phpunit": "^5.5",
        "phpunit/php-code-coverage": "^4",
        "squizlabs/php_codesniffer": "2.*"
    },
    "autoload": {
        "psr-4": {
            "PHPUnitTuts\\": "src"
        }
    }
}

phpunit.xml.dist

<phpunit bootstrap="vendor/autoload.php">
    <testsuites>
        <testsuite name="oop">
             <directory>test</directory>
        </testsuite>
    </testsuites>
</phpunit>

src/FetchTask.php

<?php

namespace PHPUnitTuts;

class FetchTask extends \PHPUnit_Framework_TestCase
{
    public static $paths = [];
}

test/FetchTaskTest.php

<?php

namespace PHPUnitTuts;

class FetchTaskTest extends \PHPUnit_Framework_TestCase
{
    public function setUp()
    {
        $this->fetch = new FetchTask();
    }

    public function testStoresListOfAssets()
    {
        $this->assertClassHasStaticAttribute('paths', FetchTask::class);
        // or
        $this->assertClassHasStaticAttribute('paths', get_class($this->fetch));
        // or
        $this->assertClassHasStaticAttribute('paths', 'PHPUnitTuts\\FetchTask');
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM