2017-06-14 154 views
0

我正在編寫SOAP API的集成測試(代碼示例如下)。如何調試SOAP調用?

現在我得到一個錯誤,並想調試我的服務器端代碼(在PhpStorm中)。但是調試器只考慮測試中的斷點並忽略服務器端代碼。

好吧,我可能粗略地理解了原因:$soapClient->doSomething(...);的調用開始一個新的HTTP請求。 如何獲得這個「子請求」(從PhpUnit的角度來看)調試?


集成測試的代碼:

class UserIntegrationTest extends TestCaseBase 
{ 
    const URL = "http://my-server.loc/soapapi/user/wsdl"; 
    public static $classMap = []; 
    /** @var SoapClient */ 
    private $soapClient; 


    /** @var ConfigurationServiceInterface */ 
    private $config; 

    public function setUp() 
    { 
     parent::setUp(); 

     $options = [ 
      'exceptions' => true, 
      'login' => 'foo', 
      'password' => 'pwd', 
      'encoding' => 'utf-8', 
//   'proxy_host' => '192.168.2.96', 
//   'proxy_port' => '8080', 
      'classmap' => [], 
      'connection_timeout' => 5, 
     ]; 

     $this->soapClient = new SoapClient(self::URL, $options); 
    } 

    /** 
    * @test 
    * @group integration 
    */ 
    public function testDoSomething() 
    { 
     $options = array(
      'exceptions' => true, 
      'login' => 'foo', 
      'password' => 'pwd', 
      'encoding' => 'utf-8', 
//   'proxy_host' => '192.168.2.96', 
//   'proxy_port' => '8080', 
      'classmap' => [], 
      'connection_timeout' => 5, 
     ); 

     $soapClient = new SoapClient(self::URL, $options); 

     $message = new MyMessage(); 
     $message->x = 1; 
     $message->y = 2; 
     $result = $soapClient->doSomething($message); 
    } 

    protected function getDataSet() 
    { 
     return new ArrayDataSet([ 
      'users' => [ 
       [ 
        'id' => 1, 
        'username' => 'foo', 
        'password' => '...', 
       ], 
      ], 
      ... 
     ]); 
    } 
} 

回答

0

的解決方案是要追加?XDEBUG_SESSION_START=ECLIPSE_DBGP由SOAP客戶端調用的URI。所以在port段的WSDL

<port name="UserPort" binding="tns:UserBinding"> 
    <soap:address location="http://my-server.loc/soapapi/user"/> 
</port> 

的位置需要的由Xdebug的查詢進行擴展,並期待這樣的:

http://my-server.loc/soapapi/user?XDEBUG_SESSION_START=ECLIPSE_DBGP 

當然,生產WSDL不應含有這種location。但是通常會生成WSDL(例如,通過Zend\Soap\AutoDiscover),並且可以輕鬆地對URI進行動態配置。

+1

...或者只是在php.ini中配置'xdebug.remote_autostart = 1' - xdebug將嘗試調試_every單一request_不管「調試我」參數/ cookie。缺點 - 影響所有請求,而不僅僅是SOAP。 – LazyOne

+0

我不想改變Xdebug的行爲。但對於一個沒有任何問題的人來說,它肯定會起作用,甚至會是更好/更簡單的解決方案。 – automatix