摘要
我有一个类,它使用debug_backtrace()来报告调用方法的地方。该方法可以在第三方代码中直接调用,也可以通过与所讨论的类位于同一个包中的某种助手方法调用。在后一种情况下,该方法将从第三方代码而不是从helper类报告行,因此实际调用者所在的索引在结果中会发生变化,因此我希望在我的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()将测试文件加载到数组中,并在数组中找到标记。这仍然有点脆弱,并不是那么优雅。
发布于 2015-05-21 02:41:22
问问自己,你想要测试的行为是什么?
如果您想确保生成精确的字符串,那么也许测试夹具是个好主意。
可能更容易维护的是断言字符串的部分,这些部分可以很容易地推断出来。
或者,您可以使用库来模拟函数调用本身,例如
发布于 2015-05-22 09:34:28
https://stackoverflow.com/questions/30360066
复制相似问题