首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何测试debug_backtrace结果?

如何测试debug_backtrace结果?
EN

Stack Overflow用户
提问于 2015-05-20 20:46:15
回答 2查看 314关注 0票数 0

摘要

我有一个类,它使用debug_backtrace()来报告调用方法的地方。该方法可以在第三方代码中直接调用,也可以通过与所讨论的类位于同一个包中的某种助手方法调用。在后一种情况下,该方法将从第三方代码而不是从helper类报告行,因此实际调用者所在的索引在结果中会发生变化,因此我希望在我的PHPUnit套件中包括一个测试,以确保在每个用例中找到正确的索引。

是否有一种方法可以自动和可靠地计算出测试文件中我的方法应该返回的正确行?

tl;dr,代码plz

下面是一些要演示的代码。这只是最简单的例子,请不要理会,这是没有道理的。实际的用例更加复杂,而且很有可能,甚至很有可能,在某个时候,我会弄乱一些东西,而这些痕迹最终会给出错误的结果。我想通过我的测试来了解这一点。

Classes.php:

代码语言:javascript
复制
<?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:

代码语言:javascript
复制
<?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()将测试文件加载到数组中,并在数组中找到标记。这仍然有点脆弱,并不是那么优雅。

EN

回答 2

Stack Overflow用户

发布于 2015-05-21 02:41:22

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

如果您想确保生成精确的字符串,那么也许测试夹具是个好主意。

可能更容易维护的是断言字符串的部分,这些部分可以很容易地推断出来。

或者,您可以使用库来模拟函数调用本身,例如

  1. https://github.com/instaclick/ICBaseTestBundle/blob/master/Test/Helper/Unit/FunctionHelper.php
  2. http://www.workhabit.com/labs/mock-function-testing-drupal
票数 0
EN

Stack Overflow用户

发布于 2015-05-22 09:34:28

因为我还没有找到更好的解决方案,所以我最后组装了一个小包,让我们从测试源中可靠地找到行。

如果你能想出一个更好的解决方案,接受的答案仍在等待你的把握!

如果有人感兴趣,我做的包是这里

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30360066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档