0

我正在为使用 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 报告我已经是最新的。

我真的被这个难住了,而且谷歌似乎没有立即提供任何帮助。

非常感谢, ns

4

1 回答 1

0

我设法找到了问题的根源——这实际上是一个 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;

    // ...
}
?>

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

问候, ns

于 2012-04-30T10:37:43.920 回答