提问人:Bevelopper 提问时间:10/29/2021 最后编辑:Bevelopper 更新时间:11/10/2021 访问量:199
在 Phpunit 中,调用扩展 TestCase 而不是原始 TestCase 的类是行不通的
In Phpunit, calling a class extending TestCase instead of the original TestCase does not work
问:
在 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
答:
我的类被命名为 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 等其他方法,但他们没有。
评论
require