0

SOAP サーバーのセットアップに取り組んでおり、特に Behat での自動テストの作成に取り組んでいます。私が直面している問題は、SOAP サーバーへの接続の認証をテストしようとしており、具体的には、ユーザー名とパスワードが提供されていないときに接続に失敗することを確認するテストを作成しようとしていることです。

ただし、HTTP 認証を追加せずに (および WSDL キャッシュを意図的に無効にして) テストを実行するたびに、コンソール画面全体にエラー トレースをスローする PHP 警告が表示されます。

これは PHP の警告です。

PHP Warning:  SoapClient::SoapClient(http://cti.local/api/v1/companies/d1/soap?wsdl): failed to open stream: HTTP request failed! HTTP/1.1 401 Unauthorized

そのエラーを抑制し、新しいクライアントを宣言するときに NULL または負の値が返されるようにしたいと考えています。これを行うために、「new」キーワードの直前に「@」記号を追加し、例外をスローしない try/catch ステートメントで呼び出しをラップしようとしました。しかし、それはうまくいきません。また、行頭に「@」記号を追加しようとしましたが、役に立ちませんでした。

これは、PHP の組み込み SOAP クライアント クラスを使用していました。この問題に遭遇するまでは、素晴らしい方法のように思えました。そこで、見つけたすべてのオプションを使い果たした後、Zend SOAP クライアントをセットアップして使用してみました。PHPの組み込みSoapClientクラスを拡張しているように見えることを発見するだけです。だからそれもうまくいきません。

残念ながら、WSDL を含む API へのすべての呼び出しに HTTP 認証を使用しています。現在、API のチェックアウト コピーをローカルで実行しています (まだ環境にセットアップしていないため)。適切な認証を入れると、正常に機能することを知っています。しかし、接続認証が失敗したことを確認したときに、自動化された Behat テストが正常にテストされ、テストに合格したメッセージが返されることを確認したいと考えています。

接続呼び出しのサンプル:

/**
 * SOAP connection initiation.
 *
 * @param string $soapURL
 * @param string $options (optional, no implemented yet)
 *
 * @Given /^I connect to a soap service at "([^"]*)"$/
 */
public function iConnectToASoapServiceAt($soapURL) {
    $this->soapURL = $soapURL;

    try {
        $this->client = @new Zend\Soap\Client($soapURL, $this->options);
        $this->soapFunctions = $this->client->getFunctions();
    }
    catch (\Exception $e) {
        #For testing when it fails we cannot actually throw an error here.
        #throw new Exception("Error connecting to SOAP server.");
    }
}

/**
 * @Given /^soap returns an error$/
 */
public function soapReturnsAnError() {
    if ($this->client !== NULL && $this->soapFunctions !== NULL) {
        throw new Exception("SOAP connection did not fail as expected.");
    }
}

誰にもアイデアはありますか?成功した接続と失敗した接続の両方を自動化された方法でテストできるようにする必要があります。エラーが発生して PHP 呼び出しが強制終了されることはありません。

4

1 に答える 1

1

@単一の関数呼び出しのエラーのみを抑制します。

失敗した認証コードが実行される前にエラー報告レベルを変更してみてください。

$level = error_reporting(E_ERROR | E_PARSE); 

// your code with failed authentication here

error_reporting($level);
于 2013-06-30T17:46:16.163 に答える