PHP 5.3.10,PHPUnit的3.6.10参考对象PHPUnit中不工作,但不会在正常PHP执行
我打电话代码中失败初始化对象的测试,从而可以使用这样的方法从中。问题是这是遗留代码,并且这个函数在我们的应用程序中经常使用。它本身在PHP下工作,但不能在PHPUnit中运行。这些调用访问我们为我们的应用程序提供的PHP扩展。 一个非常简单的例子来演示这个问题在下面。
类文件换到我们的PHP扩展(FOO)电话:
class FOO
{
$private $Bar;
pubilc function __construct()
{
$this->Bar = new OurPHPExtensionObject();
}
public function Option1($Variable)
{
return $this->Bar->OurPHPExtensionMethod($Variable);
}
public function _Option1($Variable)
{
return $Variable; // Dummy to test that code is loaded
}
}
$Bar = new FOO();
这将创建对象并加载初始数据,因此只进行一次。其他调用使用它包括一个文件,然后包括这个类。当应用程序继续运行时,唯一的初始化是第一次完成的,然后使用global关键字引用此对象来访问它的方法。
Function.php例如:
require_once('FOO.class');
function CausesError($Parameter)
{
global $Bar; // Using $Bar defined from FOO.class
$ErrorCreated = $Bar->Option1($Parameter); // Call Option from Class
}
然后,单独的程序简单地inclde与require_once(),以确保只有1从任何地方加载的文件的实例的Function.php文件。
示例文件:
require_once('Function.php');
echo CausesError('Variable Text') . "\n";
这将导致错误:
Fatal error: Call to a member function Option1() on a non-object in ...
作为新PHPUnit的,并试图尽量减少更改现有的代码,直到我能得到到位的测试中,我需要一些关于如何处理这个问题的建议。大量的现有代码通过简单包含Function.php来调用该函数,然后调用该函数(CausesError)。我不知道如何得到这个返回数据。
然后,我的测试文件在每次测试之前都有一个setUp()方法。
class TEST_Function extends PHPUnit_Framework_TestCase
{
protected function setUp()
{
require_once('Function.php);
echo _Option1('Sample') . "\n"; // Works and ECHOs to show code loaded
echo Option1('Sample2') . "\n"; // Fails with the error
}
public function testFunctionOption1()
{
$this->assertEquals(Option1('English'), 'English'); // Error
}
}
我应该在我的测试中嘲笑函数吗?我不确定哪些测试可能包含这个,因为函数在代码中使用。
希望能够描述环境和代码布局。预先感谢您的帮助。
对不起,试图缩短示例以显示我们在PHP中工作的代码中执行的操作,但不是在PHPUnit中执行。如果您查看FOO.class,则传递给Option1和_Option1的文本将简单地返回给此示例。Option1使用我们拥有的PHP扩展,而_Option1仅仅是一个返回文本的虚拟对象,但是通过代码验证来确保所有文本都被相应地预处理。尽管如此,您对唯一可用的洞察力仍然有所帮助。让我看看,并可能包含不同的文件。 – 2012-04-17 13:43:14
@StevenScott:但是你仍然需要在问题中加上瑕疵,否则 - 正如我写的 - 没有给出具体细节,你的解释也不够具体。定义是代码,而不是谈论代码。 – hakre 2012-04-17 14:01:11
主要问题似乎是全局/单例测试。我们有那些正在使用的,这是我们正在尝试发起的,因此是测试。有问题的函数在FOO.class中定义。此时返回简单文本,其中一个来自我们创建的PHP扩展。扩展程序中的代码处理传递的文本并返回修改后的文本。我们不想每次都初始化文本列表,这是单身人士的目的。 – 2012-04-17 16:48:59