Как дразнить, тестируют веб-сервис в PHPUnit через несколько тестов?

Я пытаюсь протестировать класс интерфейса веб-сервиса с помощью PHPUnit. В основном этот класс выполняет вызовы к объекту SoapClient. Я пытаюсь протестировать этот класс в использовании PHPUnit getMockFromWsdl метод описан здесь:

http://www.phpunit.de/manual/current/en/test-doubles.html#test-doubles.stubbing-and-mocking-web-services

Однако, так как я хочу протестировать несколько методов от этого того же класса, каждый раз, когда я устанавливаю объект, я также должен установить ложный объект 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);
}

11
задан CSchulz 12 July 2012 в 16:20
поделиться

2 ответа

Для базового использования подойдет что-то вроде этого. 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);
}
?>
1
ответ дан 3 December 2019 в 11:36
поделиться

Почему вы создаете макет в setUp (), если цель состоит в том, чтобы получить определение макета класса один раз за выполнение всего тестового файла? Если я правильно помню, он запускается перед каждым тестом, определенным в "этом" тестовом классе ... Попробуйте setUpBeforeClass ()

From http://www.phpunit.de/manual/3.4/en/fixtures.html

Кроме того, методы шаблона setUpBeforeClass () и tearDownAfterClass () вызываются перед запуском первого теста класса тестового примера и после выполнения последнего теста класса тестового примера, соответственно.

1
ответ дан 3 December 2019 в 11:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: