0

我们正在建立一个 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 客户端并使用它。才发现它似乎扩展了 PHP 的内置 SoapClient 类。所以这也行不通。

不幸的是,我们对 API 的所有调用都使用 HTTP 身份验证,包括对 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 调用的自动化方式测试成功的连接和不成功的连接。

4

1 回答 1

1

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

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

$level = error_reporting(E_ERROR | E_PARSE); 

// your code with failed authentication here

error_reporting($level);
于 2013-06-30T17:46:16.163 回答