2013-06-28 117 views
0

壞SoapClient的連接我們正在建立一個SOAP服務器的工作進行測試時,從拋出錯誤和異常防止PHP,我在貝哈特爲它創造自動化測試具體工作。我遇到的問題是我試圖測試到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 Client並使用它。只是發現它似乎擴展了PHP的內置SoapClient類。所以這也不起作用。

不幸的是,我們正在使用HTTP認證的API的所有調用,包括到WSDL。目前,我正在本地運行已檢出的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調用。

回答

1

@只抑制單個函數調用的錯誤。

嘗試更改錯誤報告級別執行失敗的認證代碼之前,而且比把它帶回來算賬:

$level = error_reporting(E_ERROR | E_PARSE); 

// your code with failed authentication here 

error_reporting($level); 
+1

我竟然發現這是一個需要多管齊下。首先,我必須做你的建議(保存當前水平,在問題代碼之前設置爲0,然後在完成時設置回到先前的水平)。我也必須將它包裝在try/catch中。然後,我必須確保xdebug在此期間被禁用。最後,在某些情況下,爲了達到良好的效果,我甚至必須設置自己的錯誤處理程序,這在大多數錯誤情況下基本上什麼都不做。 – pthurmond