当前位置: 首页 > 知识库问答 >
问题:

代码欺骗简单的单元测试无法找到我的命名空间

葛修筠
2023-03-14

我正在尝试使用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 

共有1个答案

焦博实
2023-03-14

代码欺骗简单的单元测试无法找到我的命名空间

这不是关于代码欺骗,而是关于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\\\)。

因此,即使您正在使用的框架(您有一个,那就是测试框架)也可能加载composer自动加载程序(很可能),只是找不到该类。

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

你是对的,但为什么?IDE没有声明任何错误。。。(你的反应)

这是两双鞋。

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

根据IDE的维护和配置情况,它可能应该也可能会突出显示这一点。

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

因此,也许在这方面也有改进,作曲家对您的项目开发来说比IDE更重要。

因此,有一个建议:

每当更改composer.json文件时,我建议运行作曲家验证-严格来检查您的状态,然后跟随作曲家更新

在运行测试之前自动运行此选项。您可能不想运行composer update,然后在运行测试运行程序之前运行composer install,如果您将它作为开发依赖项。

composer.json中的单个测试运行命令绑定此命令的示例:

{
  "scripts": {
    "test": [
      "@composer --no-plugins --version",
      "@composer validate --strict",
      "@composer --no-plugins -q install --no-scripts --no-progress",
      "codecept run unit"
    ]
  }
}

然后,只需一次调用即可运行基于Composer的项目中的所有重要内容:

$ composer test
...

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

从技术上讲,您不需要IDE,这使得它更具可移植性和稳定性,从而使您的基于作曲家的项目得以发展。

 类似资料:
  • 我在使用Yii2进行Codeception时遇到了一些问题。我刚刚升级到Yii 2.0.10,一直在使用本指南 我收到错误:

  • 我正在编写一组简单的PHP函数,我只使用纯PHP7,没有框架,什么都没有。这些函数稍后将在CMS中的插件中使用,但这不是重点。我想使用Codeception为我的函数编写单元测试(为了熟悉它,我知道Codeception基本上只在这里运行PHPUnit),但我真的不知道如何以合理的方式将Codeception指向我的代码。 我的结构如下:我有,其中包含我想要测试的函数,大致如下: 我使用Compo

  • 我正在尝试使用yii2 codeception。我有一个名为Client的类,它扩展了ActiveRecord。 规则()函数: 我在tests\codeception\unit\models文件夹中创建了一个名为ClientTest的文件,该文件包含以下内容: 当我使用“codecept run unit--debug”命令运行测试时,我看到

  • 我有一个PHP应用程序,我们正在添加测试,使用代码欺骗。我们试图添加指定(和验证)到我们的套件,但它不被识别。你如何正确设置指定与代码欺骗一起使用? 在我的composer.json中,我有以下内容: 我在添加指定和验证后运行了作曲家更新,并获得了以下输出: 我有一个这样的测试(主要是由generate:test生成的): 当我运行单元测试时,我会得到以下输出: 我使用的参考文献是:http://

  • 我正在努力提高Go gRPC服务器的覆盖率,但我在为服务器的拦截器功能编写测试时遇到了麻烦,因为我无法有意义地满足类型。 我有一个带有以下签名的函数: 我假设任何gRPC方法都会满足的签名: 所以我尝试传入一个具有此签名的方法: 我想象这会起作用,因为这是拦截器实际正在做的事情(转发RPC),但出于某种原因Go抱怨道: 不能使用AuthService。GetToken(类型func(上下文。上下文

  • 我在laravel中有一个资源控制器来管理我的用户。这将创建一个更新用户信息的路由,该路由使用HTTP PUT方法接收请求。 这里显示命令输出: 它在我的web浏览器上正常工作,但当我尝试使用codeception运行测试并提交表单时,我得到一个method not allowed异常,测试失败。 我试图了解为什么会发生这种情况,这似乎是codeception提出的请求。该请求是通过POST而不是