scr*_*ton 11 php phpunit soap web-services
我试图使用PHPUnit测试Web服务接口类.基本上,这个类调用SoapClient对象.我试图使用getMockFromWsdl此处描述的方法在PHPUnit中测试此类:
但是,由于我想从同一个类中测试多个方法,所以每次设置对象时,我都必须设置模拟WSDL SoapClient对象.这会导致抛出致命错误:
Fatal error: Cannot redeclare class xxxx in C:\web\php5\PEAR\PHPUnit\Framework\TestCase.php(1227) : eval()'d code on line 15
Run Code Online (Sandbox Code Playgroud)
如何在多个测试中使用相同的模拟对象,而不必每次都从WSDL重新生成它?这似乎是个问题.
-
有人要求发布一些代码来查看,这里是TestCase中的setup方法:
protected function setUp() {
parent::setUp();
$this->client = new Client();
$this->SoapClient = $this->getMockFromWsdl(
'service.wsdl'
);
$this->client->setClient($this->SoapClient);
}
Run Code Online (Sandbox Code Playgroud)
对于基本用法,类似这样的东西就可以了。PHPUnit 正在幕后施展一些魔法。如果您缓存模拟对象,则不会重新声明它。只需从此缓存实例创建一个新副本,您就可以开始了。
<?php
protected function setUp() {
parent::setUp();
static $soapStub = null; // cache the mock object here (or anywhere else)
if ($soapStub === null)
$soapStub = $this->getMockFromWsdl('service.wsdl');
$this->client = new Client;
$this->client->setClient(clone $soapStub); // clone creates a new copy
}
?>Run Code Online (Sandbox Code Playgroud)
或者,您可以缓存类的名称get_class,然后创建一个新实例,而不是副本。我不确定 PHPUnit 在初始化方面做了多少“魔法”,但值得一试。
<?php
protected function setUp() {
parent::setUp();
static $soapStubClass = null; // cache the mock object class' name
if ($soapStubClass === null)
$soapStubClass = get_class($this->getMockFromWsdl('service.wsdl'));
$this->client = new Client;
$this->client->setClient(new $soapStubClass);
}
?>Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9141 次 |
| 最近记录: |