2013-06-04 3 views
2

Я хочу, чтобы проверить эту функцию:Mock внутреннего вызов функции текущего класса испытываемого

public function reset() 
{ 
    if(!$this->onBeforeReset())  // Protected, internal method 
    { 
     return false; 
    } 

    // Continue with tests 
} 

Я бы хотел проверить его, когда onBeforeReset функция возвращает ложь или правду, тоже.
Как я могу это сделать? Это возможно?
Есть ли способ «издеваться» над некоторыми частями тестируемого класса?

+0

вы проверяете, если возвращаемое значение истина/ложь. что вы хотите сказать, хотите проверить то же самое? – Bere

+0

Я хочу проверить функцию 'reset', когда' onBeforeReset' возвращает true и когда 'onBeforeReset' возвращает false. – tampe125

+0

Если есть возможность, что '// continue with tests' часть возвращает код false, вы можете захотеть вернуть массив с ключом (например, 'onBeforeReset') для возвращаемого значения onBeforeReset(), а другой для сброс(). Наконец, вы можете проверить, существует ли этот конкретный ключ/set .... – Bere

ответ

1

Да, если метод, который вы хотите высмеять, является частным или окончательным, вы можете издеваться над этим методом. Пример:

$sut = $this->getMock('Your\Class', array('onBeforeReset')); 

Второй аргумент getMock методы является массивом содержит методы, которые PHPUnit порадуются. Если этот массив пуст, phpunit будет издеваться над всеми методами из объекта, но если вы точно определите хотя бы один метод, то phpunit будет высмеивать только метод, который вы передаете в этот массив.

И издеваться метод, как обычно:

$sut->expects($this->any()) 
    ->method('onBeforeReset') 
    ->will($this->returnValue(true)); 

И, наконец, вы можете проверить метод, который вы хотите, чтобы тест:

$this->assertWhatever($expectedValue, $sut->reset()); 
+0

mhm ... это интересно. Я уже использую mocks, но я не думал насмехаться над частью текущего теста. Тем не менее, мой объект возвращается с использованием метода фабрики 'getInstance', любые советы по этому поводу? – tampe125

+0

вы всегда можете высмеивать «getInstance», чтобы вернуть свой $ sut. Но определенно лучший способ - построить объект напрямую. Но обратите внимание на еще одну вещь - ваш защищенный метод «onBeforeReset» также должен быть протестирован! И частные/защищенные методы должны быть протестированы через открытый интерфейс, так что, может быть, вы вообще не хотите использовать метод «сброса»? Думаю об этом :) – Cyprian

0

Как я понимаю unittesting, вы проверяете публичные интерфейсы своих классов. Таким образом, в вашем примере вы только утверждаете результат reset(), а не все защищенные и частные функции, вызываемые внутри. Затем вы выводите, какой результат далBeforeReset() из результата reset().

Это, конечно, не правило 100%. Иногда вы действительно хотите протестировать закрытый или защищенный метод по какой-либо причине (однако учтите, что это может означать, что вы действительно должны реорганизовать свой код).

Создатель PHPUnit написал несколько мыслей и привел несколько примеров (http://sebastian-bergmann.de/archives/881-Testing-Your-Privates.html). В основном вы используете Reflection, чтобы публичные и защищенные методы и свойства публично доступны.

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