2012-04-16 36 views
0

PHP 5.3.10,PHPUnit的3.6.10参考对象PHPUnit中不工作,但不会在正常PHP执行

我打电话代码中失败初始化对象的测试,从而可以使用这样的方法从中。问题是这是遗留代码,并且这个函数在我们的应用程序中经常使用。它本身在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 
} 

然后,单独的程序简单地inclde与require_once(),以确保只有1从任何地方加载的文件的实例的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

通过你的问题,看完后我会假设你正在运行到一些其他的问题:

require_once('Function.php'); 

将确保该文件被加载一次。因此new FOO$Bar的分配只完成一次。由于该变量仅存在于单个测试功能的范围内,因此只能在setUp()函数中使用。

但是,情况可能并非如此,因为您尚未发布_Option1()Option1()的定义,所以缺少更多具体信息来正确说出幕后发生的情况。

+0

对不起,试图缩短示例以显示我们在PHP中工作的代码中执行的操作,但不是在PHPUnit中执行。如果您查看FOO.class,则传递给Option1和_Option1的文本将简单地返回给此示例。Option1使用我们拥有的PHP扩展,而_Option1仅仅是一个返回文本的虚拟对象,但是通过代码验证来确保所有文本都被相应地预处理。尽管如此,您对唯一可用的洞察力仍然有所帮助。让我看看,并可能包含不同的文件。 – 2012-04-17 13:43:14

+0

@StevenScott:但是你仍然需要在问题中加上瑕疵,否则 - 正如我写的 - 没有给出具体细节,你的解释也不够具体。定义是代码,而不是谈论代码。 – hakre 2012-04-17 14:01:11

+0

主要问题似乎是全局/单例测试。我们有那些正在使用的,这是我们正在尝试发起的,因此是测试。有问题的函数在FOO.class中定义。此时返回简单文本,其中一个来自我们创建的PHP扩展。扩展程序中的代码处理传递的文本并返回修改后的文本。我们不想每次都初始化文本列表,这是单身人士的目的。 – 2012-04-17 16:48:59

相关问题