Codeception SOAP 命名空间

Codeception SOAP Namespace

在我的 SoapCest.php 中,我发送了一个 Soap 请求:

$I->sendSoapRequest('authenticate', ['sUsername' => 'abc', 'sPassword' => 'xyz']);

这会导致 XML 故障:

Procedure 'ns:authenticate' not present

这是正确的,因为调用请求时应使用 soap:authenticate 而不是 ns:authenticate

如何更改代码接收中的名称空间 ns: 以进行测试调用?

希望能针对您的需求提出一些想法。

就我而言,我也必须更改 NS。但是 Codeception SOAP module 构建为只有 1 个 wsdl。所以你有两个选择:"fork the Module and adapt it to your needs" 或 "modify the behaviour of that module".

我选了第二个

我的 SOAP 测试是这样开始的:

Class SiteRedshopbCategory100SoapCest
{
public function _before(ApiTester $I, \Helper\SoapModule $soapModule, \Codeception\TestCase\Cest $testCase)
{
    $endpoint = 'http://mywebsite.com/index.php?webserviceClient=site&webserviceVersion=1.0.0&view=category&api=soap';
    $schema = $I->getSoapWsdlDinamically($endpoint);

    $soapModule->configure(
            $testCase,
            $endpoint,
            $schema
    );
}

public function create(ApiTester $I)
{
    $I->wantTo('POST a new category using SOAP');
    $I->amHttpAuthenticated('admin', 'admin');
    $I->sendSoapRequest('create', "<name>Category1</name>");
    $I->seeSoapResponseContainsStructure("<result></result>");
    $I->dontSeeSoapResponseIncludes("<result>false</result>");
}

在tests/_support/ApiHelper中我定义了以下函数:

class ApiHelper extends \Codeception\Module
{
    /**
     * Cached WSDL files
     */
    static private $schemas = [];

    /**
     * Returns the location of the Wsdl file generated dinamically
     *
     * @param   string  $endpoint  The webservice url.
     *
     * @return mixed
     */
    public function getSoapWsdlDinamically($endpoint)
    {
        // Gets cached WSDL static file from dynamic file
        if (!isset(self::$schemas[$endpoint]))
        {
            $wsdl = simplexml_load_file($endpoint . '&wsdl');
            $schema = $wsdl['targetNamespace'];
            self::$schemas[$endpoint] = $schema;
        }

        return self::$schemas[$endpoint];
    }

更新:2016 年 2 月 17 日 我正在添加以下评论中请求的助手

需要创建在:tests/_support/Helper/文件夹(可以用命令vendor/bin/codecept generate:helper SoapModule生成)

<?php
namespace Helper;
// here you can define custom actions
// all public methods declared in helper class will be available in $I
class SoapModule extends \Codeception\Module
{
    public function configure($testcase, $endpoint, $schema)
    {
        $this->getModule('SOAP')->_reconfigure(
            array(
                'endpoint' => $endpoint,
                'schema' => $schema,
            )
        );
        //$this->getModule('SOAP')->buildRequest();
        $this->getModule('SOAP')->_before($testcase);
    }
}

更新:以前的代码对 Codeception 2.1 有效。使用 Codeception 2.2 这不再有效。请检查:https://github.com/Codeception/Codeception/issues/3168

在 2.5 版本中,您可以这样做:

<?php
namespace Helper;

class SoapAPI extends \Codeception\Module
{
    public function configure(): void
    {
       $this->getModule('SOAP')->_reconfigure(['schema' => 'YourNamespace']);
    }
}
<?php

class SoapTestCest
{

  public function _before(SoapAPITester $I, \Helper\SoapAPI $soapModule): void 
  {
      $soapModule->configure();
  }
}