PHPunit - 测试自定义错误处理类

标签 php unit-testing phpunit

我想测试我放在一起的自定义错误处理类,但这本身就带来了一些问题。

首先,由于在测试中设置自定义 error_handler 会覆盖 PHPUnits error_handling ,因此每次更改为自定义实现并进行测试时都必须调用 restore_error_handler() ,以便以后的任何测试都具有 phpunits error_handling 。虽然我承认没有尝试过 PHPUnit 可能会在每次测试后重置自己,但我有点怀疑。

我有各种配置要测试,在不同的条件下,即 E_ERROR 、 E_WARNING 等..

然后我就有了 mock error_handler 的想法,但在测试的 mock 方面仍然很绿色。一个快速的谷歌搜索让我找到了一个类似的方法,这里是修改和实现的想法可能适合我的需要......

//Create mock with error_handler method
$errorH = $this->getMock ('ErrorHandler', array ('error_handler'));

// error handler should be called at least once
$errorH->expects ($this->atLeastOnce())->method ('error_handler');

// Mock will  need to be configured (here?) and tested 
// against specific error_handling settings 
//  not implemented yet nor needed for this post.

//set mock as error handler for duration of this test
set_error_handler (array($errorH, 'error_handler'));

//test current mock error handler configuration 
// for different conditions-> NOTICE / WARNING / ERROR

// Give phpunit's toy back!
restore_error_handler ();

这是一种有效的方法吗?

最佳答案

无需测试 PHP 的 set_error_handler()功能。您只关心您的错误处理类是否有效。将 PHP 解释器的测试留给 PHP 开发人员。 :) 像对待任何其他类一样对待您的类:实例化它并调用它的方法,传递参数以测试不同的条件。

例如,假设您的错误处理程序如下所示:

class ErrorHandler
{
    private $logger;

    private $mode;

    public function __construct($mode, $logger) {
        $this->mode = $mode;
        $this->logger = $logger;
    }

    public function handleError($code, $message, $file='', $line=0, $context=array()) {
        if ($code = E_WARNING && $this->mode == 'dev') {
            // warnings are logged in development mode
            $this->logger->log($message, Logger::WARN);
        }
        ...
    }
}

您可以使用模拟记录器来测试上述一项功能,而无需调用 set_error_handler()或触发实际的 PHP 错误。相反,就像 PHP 在这些条件下所做的那样,调用您的错误处理程序:
function testWarningsAreLoggedInDevelopment() {
    $logger = $this->getMock('Logger', array('log'));
    $logger->expects($this->once())
           ->method('log')
           ->with('message', Logger::WARN);
    $handler = new ErrorHandler('dev', $logger);
    $handler->handleError(E_WARNING, 'message');
}

美妙之处在于,如果您的错误处理程序由于错误而触发 PHP 错误,PHPUnit 将捕获它并使测试失败。如果您将 PHPUnit 的处理程序替换为您自己的处理程序,您可能会进入无限循环,因为 PHP 一遍又一遍地调用您的处理程序,直到解释器因堆栈溢出或内存不足而死亡。

关于PHPunit - 测试自定义错误处理类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6054068/

相关文章:

java - 遍历 Java 中的枚举类数组,测试每个类的 `parse()` 方法

java - 第三方休息服务的单元测试

php - Laravel 5 : assertSeeText() and html entities

javascript - jQuery $.getJSON 不返回数据

php - 从另一个目录导入并在 PHP 中显示 excel 文件。我想读取Excel并显示其内容

php - 简单 SQL 语句/PHP 函数不起作用的问题

php - 条件为 "or"的 Laravel 验证

javascript - 使用 mocha 模拟 Nodejs 中的函数

PHP 单元 - 未找到类 'PHPUnit_Framework_TestCase'

symfony - 如何在 Symfony 3.4 phpunit 测试中访问私有(private)服务?