PHPUnit перезаписывает реальный метод с заглушкой

Я только начал играть с PHPUnit, и мне было интересно, можно ли переписать / заменить метод на заглушку. У меня есть некоторый опыт работы с Sinon, и с Sinon это возможно (http://sinonjs.org/docs/#stubs)

Я хочу что-то вроде этого:

<?php

class Foo {

public $bar;

function __construct() {
$this->bar = new Bar();
}

public function getBarString() {
return $this->bar->getString();
}

}

class Bar {

public function getString() {
return 'Some string';
}

}class FooTest extends PHPUnit_Framework_TestCase {

public function testStringThing() {
$foo = new Foo();

$mock = $this->getMockBuilder( 'Bar' )
->setMethods(array( 'getString' ))
->getMock();

$mock->method('getString')
->willReturn('Some other string');

$this->assertEquals( 'Some other string', $foo->getBarString() );
}

}

?>

2

Решение

Это не будет работать, вы не сможете смоделировать экземпляр Bar внутри экземпляра Foo. Bar создается в конструкторе Foo.

Лучшим подходом было бы ввести зависимость Фу от Бара, т.е. е .:

<?php

class Foo {

public $bar;

function __construct(Bar $bar) {
$this->bar = $bar;
}

public function getBarString() {
return $this->bar->getString();
}
}

class Bar {

public function getString() {
return 'Some string';
}

}

class FooTest extends PHPUnit_Framework_TestCase {

public function testStringThing() {

$mock = $this->getMockBuilder( 'Bar' )
->setMethods(array( 'getString' ))
->getMock();

$mock->method('getString')
->willReturn('Some other string');

$foo = new Foo($mock); // Inject the mocked Bar instance to Foo

$this->assertEquals( 'Some other string', $foo->getBarString() );
}
}

Увидеть http://code.tutsplus.com/tutorials/dependency-injection-in-php—net-28146 для небольшого учебника DI.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]