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

对对象的引用在PHPUnit中不起作用,但在正常的PHP执行中起作用,phpunit,Phpunit,PHP5.3.10,PHPUnit 3.6.10 我在一个无法初始化对象的测试中调用代码,以便可以从中使用方法。问题是,这是遗留代码,并且此函数在我们的应用程序中经常使用。它本机在PHP下工作,但在PHPUnit中运行时不工作。这些调用访问应用程序的PHP扩展。 下面是一个非常简单的例子来说明这个问题 类文件来包装对PHP扩展名(FOO)的调用: 这将创建对象并加载初始数据,以便只执行一次。使用该类的其他调用包括一个包含该类的文件。当应用程序继续运行时,第一次只进行初始化,然后使用global关

PHP5.3.10,PHPUnit 3.6.10

我在一个无法初始化对象的测试中调用代码,以便可以从中使用方法。问题是,这是遗留代码,并且此函数在我们的应用程序中经常使用。它本机在PHP下工作,但在PHPUnit中运行时不工作。这些调用访问应用程序的PHP扩展。 下面是一个非常简单的例子来说明这个问题

类文件来包装对PHP扩展名(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
}
然后,各个程序只需将Function.php文件包含在require_once()中,以确保从任何位置加载的文件只有一个实例

示例文件:

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
    }
}
我应该在测试中模拟函数吗?我不确定哪些测试可能包括这个,因为函数在整个代码中都被使用


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

看完您的问题后,我认为您遇到了其他问题:

require_once('Function.php');
将确保仅加载一次文件。因此,
newfoo
$Bar
的赋值只执行一次。由于该变量因此仅存在于单个测试函数的范围内,因此它仅在
setUp()
函数中可用


但情况可能并非如此,因为您没有发布
\u Option1()
Option1()

的定义,因此缺少更多细节来正确说明幕后发生了什么。抱歉,我们试图缩短示例,以显示我们在PHP中工作的代码中所做的工作,而不是在PHPUnit中。如果查看FOO.class,本例只返回传递给Option1和_Option1的文本。Option1使用我们拥有的PHP扩展,而_Option1只是返回文本的一个伪函数,但用于代码验证以确保所有文本都得到相应的预处理。不过,您对“唯一可用一次”的见解可能会有所帮助。让我来研究一下,并可能以不同的方式包括这个文件。@StevenScott:但你仍然需要在这个问题上添加质疑,因为否则——正如我所写的那样——没有给出细节,你的解释也不够具体。定义是代码,而不是代码。主要的问题似乎是测试全局/单例。我们有那些在使用,这是我们试图启动,因此测试。不过,有问题的函数是在FOO.class中定义的。此时返回简单文本,只有一个来自我们创建的PHP扩展。扩展中的代码处理传递的文本并返回修改后的文本。我们不希望每次都初始化文本列表,这正是单例的作用。@StevenScott:一点接一点。首先解决具体问题(
$bar
不存在),然后讨论如何降低初始化测试的成本,怎么样?
require_once('Function.php');