Codeception 简单单元测试无法找到我的命名空间
Posted
技术标签:
【中文标题】Codeception 简单单元测试无法找到我的命名空间【英文标题】:Codeception Simple Unit Test Not Work To Find My Namespaces 【发布时间】:2021-09-07 02:31:40 【问题描述】:我正在尝试使用 Codeception 进行基本的 UnitTest。没有使用任何框架。
我的工作根是:
tests |
|-unit
|-Test.php
includes|
|-general
|-Custom.php
在Custom.php
<?php
namespace Custom;
class General
public static function check()
我的测试用例是:
<?php
use Custom\General;
use PHPUnit\Framework\TestCase;
final class Test extends TestCase
public function testPushAndPop(): void
General::check();
我的 composer.json 中也有:
"autoload":
"psr-4":
"Custom\\":"includes/general"
,
当我跑步时
php vendor/bin/codecept run unit
...
1) Test: Push and pop
Test tests/unit/Test.php:testPushAndPop
[Error] Class 'DB\General' not found
#1 /var/www/html/prj/tests/unit/Test.php:9
【问题讨论】:
这是自动加载问题,名为General
的类应该存储在General.php中
你是对的,但为什么呢? IDE 未声明任何错误...
【参考方案1】:
Codeception 简单单元测试无法找到我的命名空间
这不是关于 Codeception,而是 PHP 自动加载的一般工作原理以及 Composer 中自动加载的具体配置:
"autoload":
"psr-4":
"Custom\\":"includes/general"
即使是路径段includes/general
确实映射到文件系统路径includes/general/
(作曲家应该告诉你在路径段的末尾添加/
),错误消息
[Error] Class 'DB\General' not found #1 /var/www/html/prj/tests/unit/Test.php:9
显示 Composer 配置中Custom\\
的命名空间与未找到的类的命名空间不同(即DB\\
)。
所以即使你正在使用的框架(你有一个,那就是测试框架)可能会加载作曲家自动加载器(很有可能),只是找不到该类。
正如@Naktibalda 已经在评论中突出显示的那样,这只是一个简单的自动加载器配置问题。
你是对的,但为什么呢? IDE 未声明任何错误...(您的反应)
这是两双鞋。
您的 IDE 很可能不依赖自动加载器,而只是从文件系统中猜测文件。
根据您的 IDE 的维护和配置情况,它可能应该并且可以突出显示您。
另一方面,PHP 只能依赖自动加载器,在您的情况下,您将自动加载委托给composer(1)
,而不是您的 IDE。
因此,也许也可以在这方面进行改进,composer 对于您的项目开发来说比 IDE 更重要。
所以一个建议:
每当更改composer.json
文件时,我建议运行composer validate --strict
来检查您的状态,然后使用composer update
。
在运行测试之前自动运行它。你可能不想运行composer update
,然后运行composer install
,然后再运行测试运行器,如果你有它作为开发依赖项。
在composer.json
中为单个 test 运行命令绑定此示例:
"scripts":
"test": [
"@composer --no-plugins --version",
"@composer validate --strict",
"@composer --no-plugins -q install --no-scripts --no-progress",
"codecept run unit"
]
然后,您只需一个调用即可在基于 Composer 的项目中运行所有重要的事情:
$ composer test
...
顺便说一句,运行单元测试是验证自动加载配置的好方法。使用 composer 测试脚本,您也可以确保在运行测试套件时它始终是最新的。
从技术上讲,您不需要 IDE,这使得它更加便携和稳定,让您高枕无忧,让您的基于作曲家的项目得以发展。
【讨论】:
以上是关于Codeception 简单单元测试无法找到我的命名空间的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Codeception 功能测试中使用 PHPUnit 断言方法?
Mockery, Codeception 和 Symfony - 无法重新声明类
如何在 PHP Codeception 中模拟 Stripe 类