PHPUnit лучшая практика для фиксации значения, возвращаемого защищенным методом? - PullRequest
2 голосов
/ 26 сентября 2011

рассмотрим следующий код как псевдокод в стиле PHP, чтобы понять мою точку зрения.

class C extends PHPUnit_Framework_TestCase
{
  public function m1()
  {
    $v = $this->m2();

    if($v == "x")
    {
      throw new Exception();
    }
  }

  protected function m2()
  {
    [...];

    return $v;
  }
}

Теперь я хочу добавить тест, который утверждает, что исключение выдается, если m2 () возвращает "x".

Как мне это смоделировать?

Я думал об использовании Reflection для переопределения метода во время выполнения, но кажется, что Reflection не предлагает такой функциональности, и мне пришлось бы прибегнуть кэкспериментальные расширения, такие как classkit или runkit.Это будет путь?

В этом случае я мог бы расширить класс и переопределить m2 (), но куда я тогда поместил бы этот производный класс?В том же файле, что и в тесте?

Последнее решение больше не будет работать, если я выберу m2 как частное.

Я совершенно уверен, что есть лучшая практика для решенияс этой ситуацией.

Ответы [ 2 ]

4 голосов
/ 26 сентября 2011

Эфир Я совершенно не согласен с тем, что вы пытаетесь сделать здесь, или вы делаете что-то, что сильно смущает меня.

Мне кажется, что вы спрашиваете, хотите ли вы проверить, что ваш метод теста вызывает исключение .

класс C расширяет PHPUnit_Framework_TestCase

Почему вы хотите проверить свой метод испытаний?


Я собираюсь предположить, что это настоящий класс, а не ваш тест

В этом случае я всегда настаиваю на том, чтобы просто протестировать его, как если бы защищенный метод был встроен в публичный метод.

Вы хотите проверить внешнее поведение вашего класса. Не реализация. Защищенный метод и детали реализации, о которых не должен заботиться ваш тест . Это будет означать, что вам придется изменить свой тест, когда вы измените этот защищенный метод.

И оттуда:

class CTest extends PHPUnit_Framework_TestCase {

     public function testM1NormalBehavior() {

     }

     /**
      * @expectedException YourException
      */
     public function testM1ThrowsExceptionWhenM2ConditionsAreMet() {
         $c = new C('set_Up_In_A_Way_That_Makes_M2_Return_X');
         $c->m1();
     }

}
3 голосов
/ 26 сентября 2011

Вы можете использовать частичный макет C, чтобы заставить m2() вернуть "x". Я предполагаю, что extends PHPUnit_Framework_TestCase был случайным и что C на самом деле тестируемый класс, а не сам модульный тест.

class CTest extends PHPUnit_Framework_TestCase {
    /**
     * @expectedException Exception
     */
    function testM1ThrowsExceptionWhenM2ReturnsX() {
        $c = $this->getMock('C', array('m2'));
        $c->expects($this->once())->method('m2')->will($this->returnValue('x'));
        $c->m1();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...