我想测试我放在一起的自定义错误处理类,但这本身就带来了一些问题。
首先,由于在测试中设置自定义 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/