简单PHP单元测试的自动加载文件不工作

简单PHP单元测试的自动加载文件不工作,php,phpunit,autoload,Php,Phpunit,Autoload,我正在努力熟悉PHPUnit,我遵循了所有的说明 我复制/粘贴了那些src/Email.php和tests/EmailTest.php代码源。我的问题是当我尝试运行/phpunit--bootstrap src/autoload.php测试/EmailTest。文档中说我必须创建src/autoload.php,因此我遵循了前面提到的第一个示例: 我很久以前就用过这样的东西,如果你能帮我刷新 另外,考虑到我的设置,我宁愿运行/vendor/bin/phpunit--bootstrap src/a

我正在努力熟悉PHPUnit,我遵循了所有的说明

我复制/粘贴了那些
src/Email.php
tests/EmailTest.php
代码源。我的问题是当我尝试运行
/phpunit--bootstrap src/autoload.php测试/EmailTest
。文档中说我必须创建
src/autoload.php
,因此我遵循了前面提到的第一个示例:

我很久以前就用过这样的东西,如果你能帮我刷新

另外,考虑到我的设置,我宁愿运行
/vendor/bin/phpunit--bootstrap src/autoload.php测试/EmailTest
,但这与我到目前为止所写的没有什么区别

编辑:

在下面的评论之后,我公开了构造函数并再次运行测试,我收到了以下错误消息:

PHP Fatal error:  Uncaught PHPUnit\Runner\Exception: Class 'tests/EmailTest' could not be found in 'tests/EmailTest.php'. in /var/www/html/php_project/vendor/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php:99
Stack trace:
#0 /var/www/html/php_project/vendor/phpunit/phpunit/src/Runner/BaseTestRunner.php(130): PHPUnit\Runner\StandardTestSuiteLoader->load('tests/EmailTest', 'tests/EmailTest...')
#1 /var/www/html/php_project/vendor/phpunit/phpunit/src/Runner/BaseTestRunner.php(78): PHPUnit\Runner\BaseTestRunner->loadSuiteClass('tests/EmailTest', '')
#2 /var/www/html/php_project/vendor/phpunit/phpunit/src/TextUI/Command.php(180): PHPUnit\Runner\BaseTestRunner->getTest('tests/EmailTest', '', Array)
#3 /var/www/html/php_project/vendor/phpunit/phpunit/src/TextUI/Command.php(159): PHPUnit\TextUI\Command->run(Array, true)
#4 /var/www/html/php_project/vendor/phpunit/phpunit/phpunit(53): PHPUnit\TextUI\Command::main()
#5 {main}
  thrown in /var/www/html/php_project/vendor/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php on line 99

在我看来,如果您使用Composer安装PHPUnit,最好也将其用于自动加载,而不要自己动手

请允许我分享我的(自以为是的)PHP项目设置:

  • /src/
  • /tests/
composer.json(在更大的项目中检查而不是
classmap
):

“自动加载”:{
“类映射”:[
“src/”
]
},
“自动加载开发”:{
“类映射”:[
“测试/”
]
},
phpunit.xml(用于保存设置,这样您就不必一直在CLI中传递它):


/测试
然后我可以不带任何选项直接调用
/vendor/bin/phpunit
,它将运行我的所有测试


使用
classmap
可能需要运行
composer dump
在添加新类/文件后重新生成自动加载文件


在我看来,如果您使用Composer安装PHPUnit,那么最好也将其用于自动加载,而不要自己动手

请允许我分享我的(自以为是的)PHP项目设置:

  • /src/
  • /tests/
composer.json(在更大的项目中检查而不是
classmap
):

“自动加载”:{
“类映射”:[
“src/”
]
},
“自动加载开发”:{
“类映射”:[
“测试/”
]
},
phpunit.xml(用于保存设置,这样您就不必一直在CLI中传递它):


/测试
然后我可以不带任何选项直接调用
/vendor/bin/phpunit
,它将运行我的所有测试


使用
classmap
可能需要运行
composer dump
在添加新类/文件后重新生成自动加载文件


错误消息表明类
Email
的构造函数标记为
private
,而不是类加载问题。因此,您不能在类外执行
新建电子邮件()
。您正在通过Composer使用phpunit。我认为,如果您也使用Composer进行自动加载,而不是手动创建autoload.php并使用
spl\u autoload\u寄存器
,那么会更简单。这可以吗,还是您明确希望在所描述的设置中有一个解决方案?对我来说,如果我按照所描述的说明进行操作,它就会起作用:是的,我正在通过Composer使用PHPUnit,很抱歉回复太晚,感谢您提供的屏幕截图,我会在短时间内尝试它们。我按照您的说明进行操作,效果很好(我刚刚添加了
require\u once('src/Email.php'))
tests/EmailTest.php
中的
,然后删除
src/autoload.php
,它就可以工作了)。因此,如果你把你的评论变成一个答案,我将很高兴投票并接受它@托比亚斯克伍德!但是,不必手动
在测试用例中要求
源类。如果您的项目中有越来越多的类,那么这也会变得非常容易出错和乏味。我将写一个更广泛的答案,包括我建议的设置。错误消息表明类
电子邮件
的构造函数标记为
私有
,而不是类加载问题。因此,您不能在类外执行
新建电子邮件()
。您正在通过Composer使用phpunit。我认为,如果您也使用Composer进行自动加载,而不是手动创建autoload.php并使用
spl\u autoload\u寄存器
,那么会更简单。这可以吗,还是您明确希望在所描述的设置中有一个解决方案?对我来说,如果我按照所描述的说明进行操作,它就会起作用:是的,我正在通过Composer使用PHPUnit,很抱歉回复太晚,感谢您提供的屏幕截图,我会在短时间内尝试它们。我按照您的说明进行操作,效果很好(我刚刚添加了
require\u once('src/Email.php'))
tests/EmailTest.php
中的
,然后删除
src/autoload.php
,它就可以工作了)。因此,如果你把你的评论变成一个答案,我将很高兴投票并接受它@托比亚斯克伍德!但是,不必手动
在测试用例中要求
源类。如果您的项目中有越来越多的类,那么这也会变得非常容易出错和乏味。我将写一个更广泛的答案,包括我的建议设置。+1:
bootstrap=“vendor/autoload.php”
基于composer的项目的方法。有时引导中会有更多内容,请参考phpunit XML configurationon文件以了解除引导之外的更多设置,并尝试随着时间的推移消除其余内容。bootstrap包含的内容越少,项目就越容易集成。+1:
bootstrap=“vendor/autoload.php”
基于composer的项目的方法。有时引导中会有更多内容,请参考phpunit XML configurationon文件以了解除引导之外的更多设置,并尝试随着时间的推移消除其余内容。引导程序包含的内容越少,项目就越容易集成。
PHP Error:  Call to private Email::__construct() from context 'PHPUnit\Util\FileLoader' in /var/www/html/php_project/src/autoload.php on line 9
PHP Stack trace:
PHP   1. {main}() /var/www/html/php_project/vendor/phpunit/phpunit/phpunit:0
PHP   2. PHPUnit\TextUI\Command::main() /var/www/html/php_project/vendor/phpunit/phpunit/phpunit:53
PHP   3. PHPUnit\TextUI\Command->run() /var/www/html/php_project/vendor/phpunit/phpunit/src/TextUI/Command.php:159
PHP   4. PHPUnit\TextUI\Command->handleArguments() /var/www/html/php_project/vendor/phpunit/phpunit/src/TextUI/Command.php:170
PHP   5. PHPUnit\TextUI\Command->handleBootstrap() /var/www/html/php_project/vendor/phpunit/phpunit/src/TextUI/Command.php:896
PHP   6. PHPUnit\Util\FileLoader::checkAndLoad() /var/www/html/php_project/vendor/phpunit/phpunit/src/TextUI/Command.php:1035
PHP   7. PHPUnit\Util\FileLoader::load() /var/www/html/php_project/vendor/phpunit/phpunit/src/Util/FileLoader.php:45
PHP   8. include_once() /var/www/html/php_project/vendor/phpunit/phpunit/src/Util/FileLoader.php:57
PHP Fatal error:  Uncaught Error: Call to private Email::__construct() from context 'PHPUnit\Util\FileLoader' in /var/www/html/php_project/src/autoload.php:9
Stack trace:
#0 /var/www/html/php_project/vendor/phpunit/phpunit/src/Util/FileLoader.php(57): include_once()
#1 /var/www/html/php_project/vendor/phpunit/phpunit/src/Util/FileLoader.php(45): PHPUnit\Util\FileLoader::load('/var/www/html/p...')
#2 /var/www/html/php_project/vendor/phpunit/phpunit/src/TextUI/Command.php(1035): PHPUnit\Util\FileLoader::checkAndLoad('src/autoload.ph...')
#3 /var/www/html/php_project/vendor/phpunit/phpunit/src/TextUI/Command.php(896): PHPUnit\TextUI\Command->handleBootstrap('src/autoload.ph...')
#4 /var/www/html/php_project/vendor/phpunit/phpunit/src/TextUI/Command.php(170): PHPUnit\TextUI\Command->handleArguments(Array)
#5 /var/www/html/php_project/vendor/phpunit/phpunit/src/TextUI/Command.php(159): PHPUnit\TextUI\Command->run(Array, true)
#6 /var/www/html/php_project/vendor/phpunit/phpunit/phpunit(53): PHPUnit\TextUI\Command::main()
#7 {main}
  in /var/www/html/php_project/src/autoload.php on line 9
PHP Fatal error:  Uncaught PHPUnit\Runner\Exception: Class 'tests/EmailTest' could not be found in 'tests/EmailTest.php'. in /var/www/html/php_project/vendor/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php:99
Stack trace:
#0 /var/www/html/php_project/vendor/phpunit/phpunit/src/Runner/BaseTestRunner.php(130): PHPUnit\Runner\StandardTestSuiteLoader->load('tests/EmailTest', 'tests/EmailTest...')
#1 /var/www/html/php_project/vendor/phpunit/phpunit/src/Runner/BaseTestRunner.php(78): PHPUnit\Runner\BaseTestRunner->loadSuiteClass('tests/EmailTest', '')
#2 /var/www/html/php_project/vendor/phpunit/phpunit/src/TextUI/Command.php(180): PHPUnit\Runner\BaseTestRunner->getTest('tests/EmailTest', '', Array)
#3 /var/www/html/php_project/vendor/phpunit/phpunit/src/TextUI/Command.php(159): PHPUnit\TextUI\Command->run(Array, true)
#4 /var/www/html/php_project/vendor/phpunit/phpunit/phpunit(53): PHPUnit\TextUI\Command::main()
#5 {main}
  thrown in /var/www/html/php_project/vendor/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php on line 99