引用Object在PHPUnit中不起作用,但在正常的PHP执行中起作用

时间:2012-04-16 20:40:06

标签: phpunit

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
    }
}

我应该在测试中模拟该功能吗?我不确定哪些测试可能包含这个,因为函数是在代码中使用的。

希望这能描述环境和代码布局。提前感谢您的任何帮助。

1 个答案:

答案 0 :(得分:0)

在阅读完你的问题之后,我会假设你遇到了其他一些问题:

require_once('Function.php');

将确保文件仅加载一次。因此,new FOO$Bar的分配只执行一次。因为该变量仅存在于单个测试函数的范围内,所以它仅在setUp()函数中可用。

但情况可能并非如此,因为你没有公布_Option1()Option1()的定义,所以缺少更多细节来正确说出幕后发生的事情。