PHP 5.3.10、PHPUnit 3.6.10
我在无法初始化对象的测试中调用代码,以便可以从中使用方法。问题是这是遗留代码,并且这个函数在我们的应用程序中经常使用。它本机在 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 关键字来引用这个对象来访问它的方法。
函数.php 示例:
require_once('FOO.class');
function CausesError($Parameter)
{
global $Bar; // Using $Bar defined from FOO.class
$ErrorCreated = $Bar->Option1($Parameter); // Call Option from Class
}
然后,各个程序只需将 Function.php 文件包含在 require_once() 中,以确保从任何地方加载的文件只有 1 个实例。
示例文件:
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
}
}
我应该在测试中模拟该功能吗?我不确定哪些测试可能包含此功能,因为该功能已在整个代码中使用。
希望这描述了环境和代码布局。提前感谢您的任何帮助。