【问题标题】:Preventing PHP from throwing errors and exceptions when testing for a bad SoapClient connection in Behat在 Behat 中测试错误的 SoapClient 连接时防止 PHP 抛出错误和异常
【发布时间】:2013-06-28 16:31:57
【问题描述】:

我们正在建立一个 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 调用的自动化方式测试成功的连接和不成功的连接。

【问题讨论】:

    标签: php zend-framework soap automation behat


    【解决方案1】:

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

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

    $level = error_reporting(E_ERROR | E_PARSE); 
    
    // your code with failed authentication here
    
    error_reporting($level);
    

    【讨论】:

    • 我实际上发现需要多管齐下的方法。首先,我必须按照您的建议进行操作(保存当前级别,在问题代码之前设置为 0,然后在完成后设置回上一个级别)。我还必须将它包装在 try/catch 中。然后我必须确保在此期间禁用 xdebug。最后,在某些情况下,为了更好地衡量,我什至必须设置自己的错误处理程序,在大多数错误情况下基本上什么都不做。
    猜你喜欢
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 2012-08-26
    • 2012-05-23
    相关资源
    最近更新 更多