PHPUnit断言两种可能的结果之一

时间:2016-11-10 23:36:49

标签: php unit-testing phpunit

我正在编写单元测试来验证两个库的功能是否相同。基本上,测试界面。

但是,在一些与错误处理相关的测试中。错误级别不同,必须不同,因为例如,一个生成E_WARNING,另一个只生成E_USER_WARNING。

所以问题是。在PHP单元中是否有一个断言可以说,错误必须是两个可能的结果之一?类似的东西:

assertIsIn(array(E_WARNING, E_USER_WARNING), $generatedError);

我知道我可以通过在assertContains()中交换预期和实际答案或者可能对结果进行一些预先断言操作来解决它。但是有更清洁的方法吗?

2 个答案:

答案 0 :(得分:5)

可能你可以用assertContains方法实现(断言大海捞针包含一根针)。例如:

public function testAssertIsIn()
{
    $errorLevel = array(E_WARNING, E_USER_WARNING);

    $generatedError = E_WARNING;
    $this->assertContains($generatedError, $errorLevel);

    $generatedError = E_USER_WARNING;
    $this->assertContains($generatedError, $errorLevel);
}

希望这个帮助

答案 1 :(得分:1)

$this->logicalOr( $this->identicalTo( E_WARNING ), $this->identicalTo( E_USER_WARNING ) );

如果您想要更干净的代码,可以将其转换为自定义断言:

public static function assertOneOf( array $expected, $actual, $message = '' ) {
    $constraints = [];
    foreach ( $expected as $expectedValue ) {
        $constrains[] = new PHPUnit_Framework_Constraint_IsIdentical( $expectedValue );
    }
    $constraint = new PHPUnit_Framework_Constraint_Or;
    $constraint->setConstraints( $constraints );
    self::assertThat( $actual, $constraints, $message );
}