使用PHPUnit测试错误日志

使用PHPUnit测试错误日志,php,phpunit,Php,Phpunit,我有一个我想测试的函数,如下所示: class Logger { function error($msg){ if (is_string($msg)){ error_log($msg); die($msg); } elseif (is_object($msg)){ error_log($msg.' '.$msg->getTraceAsString()); die('exception'); } else {

我有一个我想测试的函数,如下所示:

class Logger {
  function error($msg){
    if (is_string($msg)){
      error_log($msg);
      die($msg);
    } elseif (is_object($msg)){
      error_log($msg.' '.$msg->getTraceAsString());
      die('exception');
    } else {
      var_dump($msg);
      die('error');
    }
  }

我想在不记录
$msg
的情况下测试此函数。有没有办法确定
错误日志
在没有日志记录的情况下是否有效?我尝试使用
setExpectedException
,但我没能捕捉到错误,它一直在记录。

显而易见的答案是一个简单的别名/代理函数,它本身在Logger类中调用
error\u log
(可以很容易地模拟,并检查设置了什么)

但是,要实际测试本机error_log函数(原始类中没有代理),可以使用名称空间。测试将最终定义为与原始代码相同的名称空间,然后在测试类之后添加一个函数-在本例中是
error\u log()
-但该函数也在名称空间中定义-因此将优先于与本机函数等效的根名称空间运行

不幸的是,您无法对
模具
(或其别名
退出
)执行相同的覆盖。它们是“语言结构”,不能像
error\u log
can那样被覆盖

<?php
namespace abc;
use abc\Logger;

class ThreeTest extends \PHPUnit_Framework_TestCase
{
    public function setUp() { $this->l = new Logger(); }
    // test code to exercise 'abc\Logger'

}

// Now define a function, still inside the namespace '\abc'.
public function error_log($msg)
{
   // this will be called from abc\Logger::error
   // instead of the native error_log() function
   echo "ERR: $msg, ";
}

您可以使用类似(还有其他)的函数模拟框架来模拟对错误日志的调用(并检查是否使用预期参数调用)

不幸的是,您不能将其用于die构造,因为这不是一个正常的函数,而是一种语言构造

然后,我将用“throw new\Exception()”(或任何其他适当的异常)替换die()

  • 测试抛出的异常和
  • 您可以在编程中决定是在调用记录器时停止执行,还是通过将调用包装到try/catch中继续执行

但我也会问自己,调用记录器时是否必须停止执行

我的兴趣主要在于如何测试调用
error\u log的代码,Alister在当前名称空间中重写error\u log的示例用于测试。