0

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

我应该在测试中模拟该功能吗?我不确定哪些测试可能包含此功能,因为该功能已在整个代码中使用。

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

4

1 回答 1

0

在阅读完您的问题后,我假设您遇到了其他问题:

require_once('Function.php');

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

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

于 2012-04-17T13:09:26.677 回答