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();
}
}
在我的 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();
}
}