在 Phpunit 中,调用扩展 TestCase 而不是原始 TestCase 的类是行不通的

In Phpunit, calling a class extending TestCase instead of the original TestCase does not work

提问人:Bevelopper 提问时间:10/29/2021 最后编辑:Bevelopper 更新时间:11/10/2021 访问量:199

问:

在 Phpunit 的上下文中,我一直在我的 Test 类中添加一些函数,我计划在其他测试中重用这些函数。

我的计划是让另一个类驻留在 tests 文件夹中以进行继承。类将继承经典的 TestCase 并添加我的额外方法。我在IDE中没有收到任何错误,但是Phpunit找不到自定义类并崩溃并显示错误消息。

我试着把它放在一个特质中。也不起作用。

同时,我正在测试我可以在同一文件夹中创建一个“User”类,并且我能够很好地实例化它,所以我停止调整命名空间,因为它似乎不是问题。我最终创建了一个具有静态方法的类并静态调用方法。

但我很好奇为什么它会这样。这是我第一次遇到这样的情况。我可以实例化文件中的类,但不能扩展或将它们用作特征。

这是我试图让我的测试继承的类:

<?php

use PHPUnit\Framework\TestCase as BaseTestCase;

class TestCase extends BaseTestCase
{
    public static function doSomething($params)
    {
       // ...
    }
}

下面是调用它的测试类:

<?php

use Model\Course;

//use PHPUnit\Framework\TestCase;

class CourseTest extends TestCase
    
    public function setUp(): void
    {
         $this->student = new Student();
    }
}

按照@hakre提供的链接,我一直在玩弄作曲家自动加载和命名空间,如下所示:

"autoload-dev": {
        "psr-4": { "Tests\\": "tests/" }
    },

然后

 "autoload-dev": {
        "psr-4": { "": "tests/" }
    },

我相应地更改了自定义 TestCase 类的命名空间(将“Test/”添加到命名空间)。我尝试在不更改 CourseTest 的命名空间的情况下对其进行测试,但无济于事。 唯一的区别是,当我在自动加载中将“空”命名空间链接到测试目录时,Student 类会在 CourseTest 中被识别和实例化,前提是我让它扩展了标准的 Phpunit TestCase 类,一旦我扩展了我的自定义 TestCase 类,我就会再次出现以下错误:

Class "TestCase" not found in phar://G:/dev/phpbin/phpunit-9.5.10.phar/phpunit/TextUI/Command.php:95
php oop 继承 命名空间 phpunit

评论

0赞 404 Not Found 10/29/2021
你能发布任何示例代码吗?它会抛出任何错误吗?你说你能够实例化其他类,但听起来你要么需要基类,要么你的命名空间发生了一些奇怪的事情。require
1赞 hakre 10/31/2021
这回答了你的问题吗?stackoverflow.com/q/18880067/367456
0赞 Bevelopper 11/10/2021
谢谢你@hakre,那个链接中有一些值得深思的东西。但解决方案是在提供给另一个 SO 页面的链接中。我现在将发布解决方案。

答:

0赞 Bevelopper 11/10/2021 #1

我的类被命名为 TestCase,就像它的父类一样。我以为 Test 类必须从另一个 Test 类继承而来,这就足够了。对于 PHPunit,一个类扩展另一个类是不够的。

父类名需要以“Test.php”后缀结尾。 好吧,我没有意识到它也使用自己的方法来调用父类......但是我发现的另一件事,真的让我感到惊讶。

首先,我认为一些保留的类名是不允许的。像 Test 或 ParentTest。我还尝试了不太明显的奇怪类名称,这些类名也是不允许的。

有些名称有效,例如 CaseTest 或 CommonTest,其他名称无效,经过几次尝试,我得出了一个结论,我不知道该怎么做。

似乎只有以字母 A、B 或 C 开头并以“Test”结尾的类名才能工作。ATest、BTest、CTest、ClassTest、CatTest、AllowedTest、BadTest 将起作用。我无法使任何其他类名起作用......

也许还有更多,但我测试了 P、X、Y 和 Z 等其他方法,但他们没有。