我正在为使用 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;
// ...
}
?>
我希望这对其他人有所帮助。
问候纳