【问题标题】:How to test debug_backtrace results?如何测试 debug_backtrace 结果?
【发布时间】:2015-05-20 20:46:15
【问题描述】:

总结

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

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


tl;博士,请代码

这里有一些代码来演示。这只是这种情况的最简单的例子,请忽略它并没有真正的意义。实际用例更复杂,很有可能,甚至很可能,在某个时间点我会搞砸一些东西,而跟踪最终会给出错误的结果。我希望我的测试能够捕捉到这一点。

类.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);
    }

}

想法

我可以将行号硬编码到测试中,然后每次测试文件中较高的内容发生更改时更新它们。即使我将这个特定的测试分离到它自己的文件中,它仍然会在某些时候中断,而且它是一个如此丑陋的解决方案,我再也无法直视自己了。

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

【问题讨论】:

    标签: php unit-testing phpunit


    【解决方案1】:

    问问自己,您要测试的行为是什么?

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

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

    或者,您可以使用诸如

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

    【讨论】:

    • 感谢您的建议!我可以模拟debug_backtrace() 以产生预定的结果,但是我的测试应该始终知道跟踪中有多少内部调用,如果内部流程发生变化,这将使我的测试无效,无论结果是否仍然正确或不。我认为我提到的“标签和搜索”会更强大。至于字符串生成部分,我认为我没有得到您的建议,因为我没有生成甚至比较任何字符串,而是行号。你能再看一遍吗?
    【解决方案2】:

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

    如果您能提出更好的解决方案,我们仍然可以接受答案!

    如果有人有兴趣,我制作的包是here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-20
      • 2012-10-25
      • 1970-01-01
      • 2015-05-02
      相关资源
      最近更新 更多