PHPUnit Assert 两种可能结果之一

PHPUnit Assert One of two possible outcomes

我正在编写单元测试来验证两个库的功能是否相同。本质上,测试一个接口。

但是,在一些与错误处理相关的测试中。 error level不一样也得不一样因为比如一个生成E_WARNING而另一个只能生成E_USER_WARNING.

那么问题来了。 PHP 单元中是否有一个断言可以说错误必须是两个可能结果之一?类似于:

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

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

也许您可以使用 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);
}

希望对您有所帮助

$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 );
}