我们正在设置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调用。
答案 0 :(得分:1)
@
仅抑制单个函数调用的错误。
尝试在执行失败的身份验证代码之前更改错误报告级别,然后再将其恢复:
$level = error_reporting(E_ERROR | E_PARSE);
// your code with failed authentication here
error_reporting($level);