[英]Autoloading class via PSR-0
I have the following directory structure 我有以下目录结构
oop
- src
- FetchTask.php
- tests
- FetchTaskTest.php
- vendor
- composer.json
- composer.lock
- phpunit.xml
// FetchTask.php // FetchTask.php
<?php
namespace PHPUnitTuts;
class FetchTask
{
}
// FetchTaskTest.php // 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 // 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.xml
<phpunit bootstrap="./vendor/autoload.php">
<testsuites>
<testsuite name="oop">
<directory>./tests</directory>
</testsuite>
</testsuites>
</phpunit>
now when i am running $ vendor/bin/phpunit
it says 现在,当我运行
$ vendor/bin/phpunit
它说
PHP Fatal error: Class 'PHPUnitTuts\\FetchTask' not found in /home/raheel/code/oop/tests/FetchTaskTest.php on line 9
PHP致命错误:在第9行的/home/raheel/code/oop/tests/FetchTaskTest.php中找不到类'PHPUnitTuts \\ FetchTask'
Please advice what i am doing wrong. 请指教我在做什么错。 Thanks
谢谢
I guess the declaration for tests is missing, you could place it in the autoload-dev block: 我猜缺少测试的声明,可以将其放在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/"
}
},
}
And your tests should live in the Tests namespace then. 然后,您的测试应该位于Tests名称空间中。
use Tests\PHPUnitTuts\FetchTask
For PSR-0 the folder structure must be changed, move the classes in a folder PHPUnitTuts: 对于PSR-0,必须更改文件夹结构,将类移动到文件夹PHPUnitTuts中:
oop
- src
- PHPUnitTuts/FetchTask.php
- tests
- PHPUnitTuts/FetchTaskTest.php
- vendor
- composer.json
- composer.lock
- phpunit.xml
Btw, PSR-0 is deprecated, why not use PSR-4? 顺便说一句,PSR-0已过时,为什么不使用PSR-4?
You're mixing concepts of PSR-0 and PSR-4. 您正在混合PSR-0和PSR-4的概念。
Move src/FetchTask.php
to src/PHPUnitTuts/FetchTask.php
. 将
src/FetchTask.php
移至src/PHPUnitTuts/FetchTask.php
。
Change 更改
"psr-0": {
"PHPUnitTuts\\": "src/"
}
To 至
"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.