Codeception 简单单元测试无法找到我的命名空间

Codeception Simple Unit Test Not Work To Find My Namespaces

我正在尝试使用 Codeception 进行基本的单元测试。没有使用任何框架。

我的工作根是:

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 

Codeception Simple Unit Test Not Work To Find My Namespaces

这不是关于 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\ 的命名空间与未找到的 class 的命名空间不同(即 DB\)。

因此即使您正在使用的框架(您有一个,那就是测试框架)也可能会加载作曲家自动加载器(很有可能),只是找不到 class。

正如@Naktibalda 已经在评论中强调的那样,这只是一个普通的自动加载器配置问题。

You are right, but why? The IDE does not claim any error... (your reaction)

这是两双鞋。

您的 IDE 很可能不依赖自动加载器,只是从文件系统中猜测文件。

根据您的 IDE 维护和配置的好坏,它可能 应该 并且 可以 强调了您这一点。

另一方面,PHP 只能依靠自动加载器,在您的情况下,您将自动加载委托给 composer(1),而不是 IDE。

所以也许在这方面也有所改进,composer 比 IDE 对您的项目开发更重要。

所以一个建议:

每当更改 composer.json 文件时,我建议 运行 composer validate --strict 检查您的状态,然后使用 composer update.

运行 这会在 运行 测试之前自动执行。您可能不想 运行 composer update,然后 运行 composer install 在 运行 测试-运行ner 之前 运行 如果您将其作为开发依赖。

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
...

运行ning 单元测试是验证自动加载配置的好方法。使用 composer 测试脚本,您可以确保它在 运行 测试套件时也始终是最新的。

从技术上讲,您不需要 IDE,这使得它更加便携和稳定,让您安心地发展基于作曲家的项目。