PhpUnit引发了异常

时间:2016-01-28 14:19:44

标签: php unit-testing testing zend-framework2 phpunit

我有以下我要测试的PHP代码。

class A
{
    private $testObject;

    public function __construct($testObject)
    {
        $this->testObject = $testObject;
    }

    public function save()
    {
        try {
           $this->testObject->doSomething();
        } catch (\Exception $e) {
            error_log($e);
            return false;
        }
        return true;
    }
}

方法doSomething()最终会抛出异常,这就是为什么它被try和catch包围着。

class ATest
{
    public function testSaveOnError()
    {
        $testObjectMock= $this->getMock(TestObject::class, ['doSomething'], [], '', false);
        $testObjectMock
            ->expects($this->once())
            ->method('doSomething')
            ->willThrowException(new \Exception());

        $a = new A($testObjectMock);
        $this->assertFalse($a->save());
    }
}

测试运行为绿色,但是在phpunit控制台中抛出了catched异常并将其记录下来。 有没有办法在UnitTests中禁用异常跟踪,或者我做错了什么?

2 个答案:

答案 0 :(得分:0)

error_log是本机功能。使用日志包装器可以模拟它并断言在异常情况下记录的内容。如果Monolog之类的内容对您的需求来说太过分了,您可以自己编写:

class MyLogger
{
    public function log($str) {
        error_log($str)
    }
}

答案 1 :(得分:0)

您需要模拟对error_log()的调用。您可以将其替换为psr-3兼容的日志库,或者使用已建议的简单类将其包装。这是恕我直言最干净的做法。

但还有另一种方法,如果您不想更改测试中的代码:覆盖当前命名空间中的error_log:

namespace N;

function error_log()
{
    ATest::logCalled = true;
}
class ATest
{
    public static $logCalled = false;
   ... 
}

现在,如果A也在命名空间N中,则对error_log的非限定调用(即没有前导反斜杠)将使用测试中命名空间中的函数。

如果需要,可以使用静态属性logCalled来断言它是否已被调用。