Я пытаюсь протестировать класс интерфейса веб-сервиса с помощью PHPUnit. В основном этот класс выполняет вызовы к объекту SoapClient. Я пытаюсь протестировать этот класс в использовании PHPUnit getMockFromWsdl
метод описан здесь:
Однако, так как я хочу протестировать несколько методов от этого того же класса, каждый раз, когда я устанавливаю объект, я также должен установить ложный объект WSDL SoapClient. Это заставляет фатальную ошибку быть брошенной:
Fatal error: Cannot redeclare class xxxx in C:\web\php5\PEAR\PHPUnit\Framework\TestCase.php(1227) : eval()'d code on line 15
Как я могу использовать тот же фиктивный объект через несколько тестов, не имея необходимость повторно создавать его от WSDL каждый раз? Это, кажется, проблема.
--
Будучи попросившимся отправлять некоторый код для взгляда на вот метод установки в TestCase:
protected function setUp() {
parent::setUp();
$this->client = new Client();
$this->SoapClient = $this->getMockFromWsdl(
'service.wsdl'
);
$this->client->setClient($this->SoapClient);
}
Для базового использования подойдет что-то вроде этого. PHPUnit делает некоторую магию за кулисами. Если вы кэшируете объект mock, он не будет повторно объявлен. Просто создайте новую копию из этого кэшированного экземпляра, и все будет в порядке.
<?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
}
?>
В качестве альтернативы, вы можете кэшировать имя класса с помощью 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);
}
?>
Почему вы создаете макет в setUp (), если цель состоит в том, чтобы получить определение макета класса один раз за выполнение всего тестового файла? Если я правильно помню, он запускается перед каждым тестом, определенным в "этом" тестовом классе ... Попробуйте setUpBeforeClass ()
From http://www.phpunit.de/manual/3.4/en/fixtures.html
Кроме того, методы шаблона setUpBeforeClass () и tearDownAfterClass () вызываются перед запуском первого теста класса тестового примера и после выполнения последнего теста класса тестового примера, соответственно.