我有以下我要测试的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中禁用异常跟踪,或者我做错了什么?
答案 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来断言它是否已被调用。