Внедрение зависимости в PHPUnit
Есть сервис(MyService.php) для которого я пишу тест, но в свою очередь этот сервис зависит от репозитория (MyRepository.php). Сделал так, создал Mock для репозитория и внедрил его в тест, но проблема в том что сервис вызывает метод репозитория, который должен вернуть результат из бд. Как быть в таком случае(т.е. проблема возникает в случае, когда нужно вызвать метод getData)?
MyServiceTest.php
class MyServiceTest extends TestCase
{
public $myRepository;
public function setUp()
{
parent::setUp();
$this->myRepository = \Mockery::mock(MyRepository::class);
}
public function testFirst()
{
$service = new MyService(
$this->myRepository
);
$chainsList = $service->getData($coin);
...
MyService.php
class MyService
{
public $myRepository;
public function __construct($myRepository)
{
$this->myRepository = $myRepository;
}
public function getData()
{
return $this->myRepository->getDataInDb();
}
}
Ответы (2 шт):
Используйте $this->createMock(), который в Ларе создает мок объект, в котором можно определить что нужно возвращать. Посмотрите как она реализована в коде Лары.
А используется так:
$this->myRepository = $this->createMock(MyRepository::class);
$this->myRepository->method("getDataInDb")->willReturn(/** подготовленная коллекция данных */);
Кроме willRewturn есть и другие варианты возврата из заглушки, в том числе вызов родных методов. Подробнее написано в справке
Ответ выше почти то что вам нужно. Только надо было указать какие методы НЕ надо мокать - они и будут реально вызваны
$this->myRepository = $this->getMockBuilder(MyRepository::class)->setMethodsExcept('getDataInDb')->getMock();