如何测试debug_backtrace结果?

时间:2015-05-20 20:46:15

标签: php unit-testing phpunit

摘要

我有一个使用debug_backtrace()的类来报告调用方法的位置。该方法可以直接或通过与所述类相同的包中的某种帮助方法在第三方代码中调用。在后一种情况下,该方法将报告第三方代码而不是辅助类的行,因此实际调用者在结果中的索引会有所不同,所以我想在我的PHPUnit中包含一个测试套件,可确保在每个用例中找到正确的索引。

有没有办法可以自动可靠地找出测试文件中我的方法应该返回的正确行?

tl; dr,代码plz

这里有一些代码要演示。这只是这种情况最简单的例子,请忽略它并不真正有意义。实际的用例更复杂,很可能,甚至可能在某些时候我会搞砸了一些东西,而这些痕迹最终会给出错误的结果。我喜欢我的测试来抓住它。

Classes.php:

<?php

class Tracer
{
    public function send()
    {
        $trace = debug_backtrace();

        if ($trace[1]['class'] === 'Helper') {
            $calledOnLine = $trace[2]['line'];
        } else {
            $calledOnLine = $trace[1]['line'];
        }

        return $calledOnLine;
    }
}

class Helper
{
    public static function send()
    {
        $Tracer = new Tracer;
        return $tracer->send();
    }
}

TracerTest.php:

<?php

class TracerTest extends PHPUnit_Framework_TestCase
{
    public function testGetProperCallerInfo()
    {
        $Tracer = new Tracer;

        $result1 = $Tracer->send();  // $TargetLine1
        $result2 = Helper::send();   // $TargetLine2

        $this->assertEquals($TargetLine1, $result1);
        $this->assertEquals($TargetLine2, $result2);
    }

}

我可以将行号硬编码到测试中,然后每次在测试文件中更高的位置发生变化时更新它们。即使我把这个特定的测试分开到它自己的文件中,它仍然会在某个时候破坏,除了它是一个如此丑陋的解决方案之外,我再也无法看到自己的眼睛了。

另一种方法可能是使用注释标记目标行,将测试文件加载到具有file()的数组,并在数组中查找标记。这仍然有些脆弱,并不是那么优雅。

2 个答案:

答案 0 :(得分:0)

问问自己,你试图测试的行为是什么?

如果你想确保生成精确的字符串,那么测试装置可能是个好主意。

可能更容易维护的是断言可以很容易推断的字符串部分。

或者,您可以使用诸如

之类的库来模拟函数调用
  1. https://github.com/instaclick/ICBaseTestBundle/blob/master/Test/Helper/Unit/FunctionHelper.php
  2. http://www.workhabit.com/labs/mock-function-testing-drupal

答案 1 :(得分:0)

由于我还没能找到更好的解决方案,我最终整理了一个小包,让我可以从测试源中可靠地找到线路。

如果你能提出更好的解决方案,那么接受的答案仍有待争取!

如果有人感兴趣,我提供的套餐是here