0

私はSOAPを使用するPHPライブラリのユニットテストを書いています。テストケースには2つのテストが含まれています。

ライブラリは2番目の単体テストで次のメッセージでフォールオーバーしています(私は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); 

これは、他のスクリプトから通常の方法で呼び出された場合でも失敗しません-2番目の単体テストから使用された場合にのみ失敗します。これは、2番目のSOAP呼び出しでグローバル変数に何らかの認証またはトークンエラーがあることを意味します。

UnitTestファイルの56行目は次のとおりです。

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

PHPマニュアルでSoapClient::_ call():を調べましたが、この関数は非推奨であり、代わりにSoapClient::_soapCallを使用する必要があります。問題は、それをそれに変更する方法がわからないことです。

php-soapを更新しようとすると、私はすでに最新であると報告されます。

私は本当にこれに困惑していて、Googleからの即時の助けはないようです。

どうもありがとう、 ns

4

1 に答える 1

0

私はなんとか問題の根本を見つけることができました-それは実際には私のSOAPライブラリにあるいくつかのグローバル変数に関するPHPUnitの問題でした。この質問のタイトルを、当初考えていたphp-soapではなくPHPUnitを反映するように変更します。

Sebastian Bergmann(PHPUnitの作成者)によるこのブログ投稿は本当に役に立ちました:

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

彼が含めたいくつかの重要な声明は次のとおりです。

シングルトンを使用するコードをテストするのは困難です。グローバル変数を使用するコードについても同じことが言えます。」

通常、テストするコードはグローバル変数と強力に結合されており、その作成を制御することはできません。追加の問題は、あるテストのグローバル変数への変更が別のテストを壊す可能性があるという事実です。

グローバル変数とスーパーグローバル変数のバックアップおよび復元操作の実装では、serialize()とunserialize()を使用します。たとえば、PDOなどのPHP自体によって提供される一部のクラスのオブジェクトはシリアル化できず、そのようなオブジェクトが$GLOBALS配列に格納されている場合はバックアップ操作が中断されます。

グローバル変数とスーパーグローバル変数のバックアップと復元の操作は、次のように無効にできます。

<?php
class MyTest extends PHPUnit_Framework_TestCase
{
    protected $backupGlobals = FALSE;

    // ...
}
?>

これが他の人の役に立つことを願っています。

よろしく、 ns

于 2012-04-30T10:37:43.920 に答える