如何在一次测试中测试多个 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.???我不需要为此进行测试(或者您还需要为您的测试编写测试,因为测试也可以更改)。
如果有人更改了方法签名,他们应该有正当理由。如果他们犯了错误,他们可能没有用测试来覆盖他们的重构,所以问题不在单元代码中,也不是用单元测试来测试。
请记住,一项测试应该只有一个失败原因。因此,在编写(单元)测试时以此为目标是很好的。
我有以下方法:
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.???我不需要为此进行测试(或者您还需要为您的测试编写测试,因为测试也可以更改)。
如果有人更改了方法签名,他们应该有正当理由。如果他们犯了错误,他们可能没有用测试来覆盖他们的重构,所以问题不在单元代码中,也不是用单元测试来测试。
请记住,一项测试应该只有一个失败原因。因此,在编写(单元)测试时以此为目标是很好的。