gpt4 book ai didi

php - 如何在 PHPUnit 中使用数据提供程序测试异常?

转载 作者:可可西里 更新时间:2023-10-31 22:51:47 29 4
gpt4 key购买 nike

PHPUnit 有一个非常有用的特性 @dataProvider , 这允许测试一个方法的多个案例。它还有另一个很酷的注释 -- @expectedException以确保应用程序在定义的位置抛出正确的 Exception

我目前正在针对多种边缘情况测试一种方法,并想像这样结合这两个功能(不是工作代码):

class TestMyClass
{
/**
* @dataProvider provideDataForFoo
*/
public function testFoo($paramBar, $paramBuz, $expected)
{
$myObject = new MyClass();
$this->assertEquals($expected, $myObject->foo($paramBar, $paramBuz));
}
public function provideDataForFoo()
{
return [
['expected lorem', 'bar lorem', 'buz lorem'],
['expected ipsum', 'bar ipsum', 'buz ipsum'],
['expected exception', 'bar invalid argument', 'buz invalid argument'],
];
}
}

在使用@dataProvider时,是否可能/如何使用@expectedException作为其中一种情况?

最佳答案

PHPUnit 不提供这种组合。但这可以通过一个简单的技巧来实现:

  1. 基本解决方案

用于正常和异常测试的单独测试方法。

class TestMyClass
{
/**
* @dataProvider provideDataForFoo
*/
public function testFoo($paramBar, $paramBuz, $expected)
{
$myObject = new MyClass();
$this->assertEquals($expected, $myObject->foo($paramBar, $paramBuz));
}
public function provideDataForFoo()
{
return [
['expected lorem', 'bar lorem', 'buz lorem'],
['expected ipsum', 'bar ipsum', 'buz ipsum'],
];
}
/**
* @dataProvider provideDataForFooException
*/
public function testFooException($paramBar, $paramBuz, $expectedException)
{
$myObject = new MyClass();
$this->expectException($expectedException);
$myObject->foo($paramBar, $paramBuz);
}
public function provideDataForFooException()
{
return [
['expected exception', 'bar invalid argument', '\My\Exception\Fully\Qualified\Name'],
];
}
}
  1. 扩展解决方案

一个。一种测试方法和使用 Reflection API。

我们只有一种测试方法。数据提供者方法返回一个数组,其中$expected 测试方法输入的元素可以是Exceptions。如果 $expected 是一个 Exception,我们用 expectException(...) 处理这种情况,否则作为“正常”测试用例。

一种测试方法并使用“异常”标志。

理论上一个方法可以返回一个Exception。考虑到这种情况,我们必须引入一个标志,如“testItForException”,并将此信息提供给测试方法。它也可以是另一个元素,例如exception,在数据提供者方法返回的数组中(然后在测试方法中:if(! (empty($exception)) { test it as normal } else {expect exception} )).

关于php - 如何在 PHPUnit 中使用数据提供程序测试异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39486689/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com