使用全局变量的 PHPUnit 测试代码.(是:提供的参数不是有效的 sdl 资源)


PHPUnit testing code that uses globals. (Was: Supplied argument is not a valid sdl resource)

我正在为使用 SOAP 的 PHP 库编写单元测试。测试用例中有两个测试。

该库在第二个单元测试中失败,并显示以下消息(我正在使用 PHPUnit(:

SoapClient::__call(): supplied argument is not a valid sdl resource
/test/SOAPLib.php:186
/test/SOAPLibTest.php:56

我正在测试的库的第 186 行是:

$issue = $client->getIssueById($auth_token, $id); 

当以通常的方式从任何其他脚本调用时,这不会失败 - 它仅在从第二个单元测试中使用时才失败。这意味着在我的第二个 SOAP 调用中,全局变量存在某种身份验证或令牌错误。

UnitTest 文件的第 56 行是:

list($summary, $pri) = 'SOAPLibTest'get_issue_by_id($id);

我已经在PHP手册中查找了SoapClient::_call((:,其中说该函数已被弃用,我应该使用SoapClient::_soapCall。问题是我不知道如何将其更改为那个。

尝试更新我已经是最新的php-soap报告。

我真的被这个难住了,谷歌似乎没有任何直接的帮助。

非常感谢,

我设法找到了问题的根源 - 这实际上是一个PHPUnit问题,我的SOAP库中有一些全局变量。我将更改此问题的标题以反映PHPUnit,而不是我最初认为的php-soap。

Sebastian Bergmann(PHPUnit的创建者(的这篇博文非常有帮助:

http://sebastian-bergmann.de/archives/797-Global-Variables-and-PHPUnit.html

他包括的一些重要声明是:

很难测试使用单例的代码。对于使用全局变量的代码也是如此。

通常,要测试的代码与全局变量紧密耦合,您无法控制其创建。另一个问题是,一个测试对全局变量的更改可能会破坏另一个测试。

全局变量和

超全局变量的备份和还原操作的实现使用 serialize(( 和 unserialize((。例如,PHP 本身提供的某些类的对象(如 PDO(无法序列化,例如,当此类对象存储在 $GLOBALS 数组中时,备份操作将中断。

全局变量和

超全局变量的备份和还原操作可以像这样禁用:

<?php
class MyTest extends PHPUnit_Framework_TestCase
{
    protected $backupGlobals = FALSE;
    // ...
}
?>

我希望这对其他人有所帮助。

问候