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 进行单元测试:解析错误

如何在 Codeception 功能测试中使用 PHPUnit 断言方法?

Mockery, Codeception 和 Symfony - 无法重新声明类

如何在 PHP Codeception 中模拟 Stripe 类

Travis-CI 可以运行 Codeception 测试吗?

有没有办法控制 Codeception 中的测试顺序?