PHPUnit并使用Reflection

时间:2016-08-09 10:41:04

标签: php reflection phpunit

我不一定要寻找具体涉及Reflection的答案,任何有效的答案都可以。

我有以下抽象类,它由另一个类扩展:

abstract class A_Class{

    protected function returnSomething(array $param = ['some_argument' => false])
    {
        if(!is_bool($param))
        {
            throw new Exception('some message goes here');
        }
    }
}

class B_Class extends A_Class{}

我正在使用PHPUnit 4.8.27 by Sebastian Bergmann and contributors.

我有以下测试

/**
 * @expectedException \Exception
 */
public function testException()
{
    $method = new ReflectionMethod(B_Class::class, 'returnSomething');
    $method->setAccessible(true);
    $method->invokeArgs(new B_Class(), ['some_argument' => 'string']);
}

当我运行测试时,会出现以下消息:

Failed asserting that exception of type "\Exception" is thrown.

我已经谷歌了一下,我无法找到并回答我做错了什么。说实话,我甚至不确定我做错了什么。问题本身可能与我的代码不同,与Reflection类一样多。我不太了解它,所有的文档都有点,嗯,缺乏。它可能无法抛出反射类中定义的异常。

非常感谢任何正确方向的指示。

到目前为止我尝试过:

使用ReflectionClass代替ReflectionMethod

/**
 * @expectedException \Exception
 */
public function testGetExcerptException()
{
    $method = new ReflectionClass(new B_Class()::class);
    $methodToCall = $method->getMethod('returnSomething');
    $methodToCall->setAccessible(true);
    $methodToCall->invokeArgs(new B_Class(), ['some_argument' => 'string']);
}

将可见性设置为公开,这当然有效,但这种做法会失败。

如果有人遇到这个问题。不要做我做的事。甚至是The guy that wrote PHPUnit says it's a bad idea。所有测试方法都应公开。

1 个答案:

答案 0 :(得分:2)

使用Reflection的替代解决方案,因为您使用的是PHPUnit,所以使用MockObjects。 PHPUnit中的模拟允许您模拟类的任何公共和受保护方法。