在Behat中测试错误的SoapClient连接时,防止PHP抛出错误和异常

时间:2013-06-28 16:31:57

标签: php zend-framework soap automation behat

我们正在设置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 Client并使用它。只是发现它似乎扩展了PHP的内置SoapClient类。所以这也不起作用。

不幸的是,我们使用HTTP auth来调用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 个答案:

答案 0 :(得分:1)

@仅抑制单个函数调用的错误。

尝试在执行失败的身份验证代码之前更改错误报告级别,然后再将其恢复:

$level = error_reporting(E_ERROR | E_PARSE); 

// your code with failed authentication here

error_reporting($level);