2017-06-14 150 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