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关键字引用此对象以访问它的方法。
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
}
然后,各个程序只需使用require_once()填充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
}
}
我应该在测试中模拟该功能吗?我不确定哪些测试可能包含这个,因为函数是在代码中使用的。
希望这能描述环境和代码布局。提前感谢您的任何帮助。
答案 0 :(得分:0)
在阅读完你的问题之后,我会假设你遇到了其他一些问题:
require_once('Function.php');
将确保文件仅加载一次。因此,new FOO
到$Bar
的分配只执行一次。因为该变量仅存在于单个测试函数的范围内,所以它仅在setUp()
函数中可用。
但情况可能并非如此,因为你没有公布_Option1()
和Option1()
的定义,所以缺少更多细节来正确说出幕后发生的事情。