Я хочу протестировать метод класса, который вызывает родительский метод с тем же именем. Есть ли способ сделать это?
class Parent {
function foo() {
echo 'bar';
}
}
class Child {
function foo() {
$foo = parent::foo();
return $foo;
}
}
class ChildTest extend PHPUnit_TestCase {
function testFoo() {
$mock = $this->getMock('Child', array('foo'));
//how do i mock parent methods and simulate responses?
}
}
Вы не издеваетесь и не заглушаете методы в проверяемой теме (SUT). Если вам кажется, что вам нужно смоделировать или заглушить метод в родительском объекте SUT, это, вероятно, означает, что вы должны были использовать не наследование, а агрегацию.
Вы издеваетесь над зависимостями испытуемого. Это означает, что любые другие объекты, которые SUT требует для работы.
На мой взгляд, удовлетворительным решением является создание класса, который наследуется от тестируемого вами класса, и переопределяет реализацию метода, который вы хотите дать другой реализации. Это имеет свои недостатки: это не всегда работает, например, для уже переопределенных методов и для частных методов.
class Parent
{
function bar()
{
echo 'bar';
}
}
class Child extends Parent
{
function foo()
{
parent::bar();
echo 'foo';
}
}
class mockChild extends Child
{
function bar()
{
echo 'baz';
}
}
class ChildTest extends PHPUnit_TestCase
{
function testFoo() {
$sut = new mockChild();
$sut->foo();
}
}
Вот как я это сделал, я понятия не имею, если это правильно, но это работает:
class parentClass {
public function whatever() {
$this->doSomething();
}
}
class childClass extends parentClass {
public $variable;
public function subjectUnderTest() {
$this->variable = 'whocares';
parent::whatever();
}
}
сейчас в тесте я делаю:
public function testSubjectUnderTest() {
$ChildClass = $this->getMock('childClass', array('doSomething'))
$ChildClass->expects($this->once())
->method('doSomething');
$ChildClass->subjectUnderTest();
$this->assertEquals('whocares', $ChildClass->variable);
}
что за?
Мое рассуждение здесь состоит в том, что все, что я действительно хочу проверить, - это установлена ли моя переменная. меня действительно не волнует, что происходит в родительском методе, но так как вы не можете предотвратить вызов родительского метода, то, что я делаю, это высмеивает зависимые методы родительского метода.
А теперь иди и скажи мне, что я не прав :)