Можно ли смоделировать объект / функцию из необходимого класса? - PullRequest
2 голосов
/ 24 февраля 2012

Я пытаюсь протестировать некоторые из моих php-кодов, но потерпел неудачу с насмешливыми объектами.Я хочу смоделировать функцию, которая делает запрос curl, так как он не должен делать запрос каждый раз / тест.Дразнить саму функцию curl, работает.Не удается запросить другой класс и высмеивать его там.

Вот файлы:

helper.curl.php:

  class Helper_Curl {

    /*
    ** __construct($callDomain) - construct new curl helper using set calldomain
    */
    public function __construct($callDomain) {
      $this->callDomain = $callDomain;
    }

    /*
    ** sendPostArrayToApi($Array) - HTTP POST request to server
    */
    public function sendPostArrayToApi($Array) {

      $ch = curl_init();
      curl_setopt($ch, CURLOPT_URL, $this->callDomain);
      // [... curl Settings ...]
      $return = curl_exec($ch);
      curl_close($ch);
      return $return;
    }     
  }

class.request.php

  require_once('helper.curl.php');

  class RequestClass {

    function _set($data, $set_type='edit'){

      // [... some code ...]

      $curl = new Helper_Curl('http://example.com');
      $xml = $curl->sendPostArrayToApi($InfoArray);

      if($xml == "") {
        return false;
      }
      // [... some more code ...]
    }     
  }

И, наконец, тест:

  class ClassRequestTest extends PHPUnit_Framework_TestCase {

    public function setUp() {
      require_once('class.request.php');
    }

    public function testSetRefund() {

      $xml = '<?xml version="1.0" encoding="UTF-8"?>
              <response>
                <info-id>12345</info-id>
                <transmit-id>315</transmit-id>
              </response>';

      $stubCurl = $this->getMock('Helper_Curl');

      $stubCurl->expects($this->once())
               ->method('sendPostArrayToApi')
               ->will($this->returnValue($xml));

      $this->object->_set($DataArray);
    }

    protected function tearDown() {
      unset($this->object);
    }
  }

Функция sendPostArrayToApi из класса Helper_Curl должна быть смоделирована и возвращать данные xml для продолжения функции _set.Как мне прикрепить $ stubCurl к объекту $ this->?Возможно ли это как-нибудь?

Спасибо за ваше время.

1 Ответ

1 голос
/ 24 февраля 2012

Насколько я понимаю, вы должны использовать эту модель в сочетании с автозагрузкой.Поскольку у вас есть «жесткая» зависимость от вашего помощника cURL (то есть «require_once» в вашем файле class.request), когда он доберется до этого вызова в коде, PHP увидит только реальный класс cURL и будет его использовать.Если вы используете автозагрузку, то PHP может перехватить вызов для автозагрузки этого класса и заменить имитацию.

В противном случае (и это может быть лучшим решением), вы должны посмотреть на какой-то IoC решение, при котором зависимость от класса cURL не жестко запрограммирована в вашем классе запроса (т.е. вы не создаете экземпляр объекта cURL непосредственно в классе запроса).Есть разные способы достичь этого. DI или, точнее, Dependency Injection Containers - это актуальная тенденция в PHP.Возможно, вы захотите взглянуть на Service Locator .Есть хорошая статья Мартина Фаулера , которая описывает все эти шаблоны и различные плюсы и минусы.С помощью любого из этих шаблонов вы можете гораздо проще заменить тестируемые объекты (макеты, заглушки и т. Д.) В тестируемый код.

...