如何在一次测试中测试多个 PHP 类型错误?

How to test multiple PHP TypeErrors in one test?

我有以下方法:

MyClass {
   public function __construct(array $data, ?SomeObject $object): void
}

我有以下测试:

public function testWrongDataTypeThrowsErrorException(): void
{
    $this->expectException(TypeError::class);

    //works as expected
    new MyClass(null, new SomeObject);
    
    //this is never called
    new MyClass('string', new SomeObject);
}

发生的事情是它只运行 1 test/assertion 带有 null 参数。当我第二次尝试使用字符串创建 MyClass 时,它永远不会到达那里。这是为什么?

如果代码抛出常规异常,同样的逻辑也适用。

我可以写两个单独的方法来代替,但是那很不方便。

或者测试这个是愚蠢的吗?我的想法是我想测试该方法是否接受数组并且只接受数组。因此,如果有人将其从方法中删除,测试将失败。

expectExeception...exepectError... 直接放在 您要为其断言的操作之前。

如果您需要多个,请编写多个测试方法 - 分别针对每个异常和错误。


上面的建议是它如何与开箱即用的 Phpunit 一起工作,并且通常保持您的测试干净。

然而,也可以选择仅在此处使用 PHP 并按如下方式处理它:

try {
    new MyClass(null, new SomeObject);
    $this->fail('an expected exception was not thrown');
} catch (TypeError $e) {
    $this->addToAssertionCount(1);
}

然后测试方法不会中断,您可以继续(您必须删除较早的 TypeError 预期,因为 Phpunit 将不再检测到它)。

如果你觉得这比单独测试更方便,那就去做吧。

您甚至可以添加一个辅助函数并传入一个闭包,这样您就可以将其包装起来。通常情况下,如果您真的必须进行测试,恕我直言,最好坚持干净测试。

根据您在问题中所写的内容,我认为问题已在 PHP 中解决,因为 array 类型提示回到 PHP 5.???我不需要为此进行测试(或者您还需要为您的测试编写测试,因为测试也可以更改)。

如果有人更改了方法签名,他们应该有正当理由。如果他们犯了错误,他们可能没有用测试来覆盖他们的重构,所以问题不在单元代码中,也不是用单元测试来测试。


请记住,一项测试应该只有一个失败原因。因此,在编写(单元)测试时以此为目标是很好的。