2014-10-17 6 views
3

У меня есть класс, как это:PHPUnit: Как издеваться над частными методами?

class A { 

    private function testing($x) 
    { 
     // do something 
     $this->privateMethod(); 
    } 

    private function privateMethod($number) { 
     // do something 
    } 

} 

Для вызова тестирования() Я использую это:

$reflection = new \ReflectionClass('A'); 
$method = $reflection->getMethod('testing'); 
$method->setAccessible(TRUE); 

$object = new A(); 
$parameters = array(); 
$result = $method->invokeArgs($object, $parameters); 

Но я не знаю, как издеваться privateMethod(). Я хочу проверить только код в методе testing(). Я хочу указать, что я хочу, чтобы privateMethod() возвращал результат без фактического вызова метода.

+0

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

+1

Пункт модульного тестирования - проверить свой публичный интерфейс. В конечном итоге ваш частный метод должен быть вызван где-то в вашем коде, вызванном общедоступным/защищенным методом. Теоретически, если ваш частный метод работает не так, как ожидалось, вызывающий код (который вы тестируете) не будет работать, поэтому любые утверждения, которые вы сделали, должны завершиться неудачно. – Crackertastic

+0

Мой класс включает в себя один открытый метод и около 10 частных методов. Открытый метод просто вызывает несколько частных методов, и работа на самом деле делает их. Результат любого из них зависит от данных в databese. Как проверить эти методы? – micobg

ответ

4

Если вы можете изменить конфиденциальность для защиты, вы можете использовать для этого частичные макеты.

$object = $this->getMockBuilder('A') 
    ->setMethods(array('privateMethod')) 
    ->getMock(); 
$object->expects($this->any()) 
    ->method('privateMethod') 
    ->will($this->returnValue($x)); 

Это заменит реализацию только на методах в setMethods массиве, и все другие методы будут выполнять исходный код. Однако это не работает для частных методов, так как макетные объекты расширяют исходный; но он не может переопределить private.

+0

в случае, если кто-то приходит сюда, чтобы найти **, как издеваться над частными методами в Mockery ** - ответ заключается в том, что Mockery не поддерживает насмешливые частные или защищенные методы по дизайну: https://github.com/padraic/mockery/issues/30 # issuecomment-1742564 –

Смежные вопросы