2013-06-28 1 views
0

SOAP 서버를 설정하는 중입니다. 특히 Behat에서 자동화 된 테스트를 만들고 있습니다. 내가 실행중인 문제는 SOAP 서버에 대한 연결 인증을 테스트하고 특히 사용자 이름과 암호가 제공되지 않을 때 연결에 실패하는지 확인하는 테스트를 작성하려고하는 것입니다.Behat에서 잘못된 SoapClient 연결을 테스트 할 때 PHP가 오류 및 예외를 throw하지 못하도록 함

그러나 HTTP 인증을 추가하지 않고 (의도적으로 WSDL 캐싱을 비활성화 한) 테스트를 실행할 때마다 콘솔 화면 전체에 오류 추적을 발생시키는 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 또는 음의 반환 확인 할 수 있도록 :

그것은 읽는 PHP 경고입니다. 이렇게하려면 "새"키워드 바로 앞에 "@"기호를 추가하고 예외를 throw하지 않는 try/catch 문에서 호출을 래핑하려고 시도했습니다. 하지만 그건 효과가 없습니다. 또한 라인 시작 부분에 "@"기호를 추가하여 사용하지 않으려 고 시도했습니다.

PHP의 빌트인 SOAP 클라이언트 클래스를 사용하고있었습니다. 내가이 문제를 다룰 때까지가는 것은 굉장한 길처럼 보였다. 그렇다면 Zend SOAP Client를 설정하고 사용하려고 시도했던 모든 옵션을 다 써 버린 후 시도해 보았습니다. 오직 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 호출을 오류없이 종료 할 수 있어야합니다.

답변

1

@은 단일 함수 호출의 오류 만 표시합니다.

실패한 인증 코드가 실행되기 전에 오류보고 수준을 변경 시도하고보다 것은 나중에 다시 그것을 가지고 : 나는 실제로 다각적 인 접근이 필요하다는 발견

$level = error_reporting(E_ERROR | E_PARSE); 

// your code with failed authentication here 

error_reporting($level); 
+1

. 우선 나는 당신이 제안한 것을해야했다. (현재 레벨을 저장하고, 문제 코드 앞에 0으로 설정 한 다음, 완료시 이전 레벨로 다시 설정한다.) 나는 또한 try/catch로 랩핑해야했다. 그런 다음 xdebug가 비활성화되어 있는지 확인해야했습니다. 마지막으로, 어떤 경우에는 좋은 측정을 위해, 대부분의 오류 경우에 본질적으로 아무것도하지 않는 자체 오류 처리기를 설정해야했습니다. – pthurmond