2015-02-09 4 views
2

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

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

<?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

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

Лучшим подходом было бы введение зависимости Foo к Bar, i. е .:

<?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.

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