【问题标题】:In Phpunit, calling a class extending TestCase instead of the original TestCase does not work在 Phpunit 中,调用扩展 TestCase 而不是原始 TestCase 的类不起作用
【发布时间】:2021-12-14 03:32:20
【问题描述】:

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

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

我试着把它放在一个特质中。也不行。

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

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

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

<?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 的命名空间的情况下对其进行测试,但无济于事。 唯一的区别是,当我将“空”命名空间链接到自动加载中的测试目录时,如果我让它扩展了标准的 Phpunit TestCase 类,则 Student 类在 CourseTest 中被识别和实例化,只要我让它扩展我的自定义 TestCase 类我再次出现以下错误:

Class "TestCase" not found in phar://G:/dev/phpbin/phpunit-9.5.10.phar/phpunit/TextUI/Command.php:95

【问题讨论】:

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

标签: php oop inheritance namespaces phpunit


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2017-02-24
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 2021-12-02
    • 1970-01-01
    • 2016-01-09
    • 2021-07-06
    • 1970-01-01
    相关资源
    最近更新 更多