Если вы хотите выполнить тестирование модуля php на классе «Foo» и издевается над «Обязательным» объектом. Просто сделайте это, как показано ниже:
class Foo {
private $required;
public function __construct(\Required $required){
$this->required = $required;
}
public function bar(){
return $this->required->getTextFromBarTable();
}
}
class FooTest extends PHPUnit_Framework_TestCase {
public function testBar(){
$mock = \Mockery::mock('\Required'); // Dummy, There are no properties or methods.
/**
* Stub "getTextFromBarTable" method of \Required class
* and fakes response by returning "return this text".
*/
$mock->shouldReceive('getTextFromBarTable')
->andReturn('return this text');
// create "Foo" Object by using $mock instead of actual "\Required" Object.
$foo = new Foo($mock);
$response = $foo->bar();
$this->assertEqual('return this text', $response);
}
}
Вы не должны заглушать или издеваться над классом, над которым вы хотите выполнить модульное тестирование. Просто сделайте это в классе зависимости, например «\ Required».
мы делаем STUB или MOCK, чтобы отделить ВНЕШНЮЮ логику, которая может повлиять на внутреннюю логику метода, который мы собираемся протестировать. В этом случае я предположил, что \ Required класс имеет метод getTextFromBarTable, и этот метод будет подключаться и получать поле «текст» из базы данных. Метод «testBar» будет разорван, если наша база данных не имеет текстового поля. Чтобы избавиться от внешних проблем, я сделал заглушку на «\ Required», и каждый раз я использую метод getTextFromBarTable. Он всегда вернет мне «вернуть этот текст».