【发布时间】: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