Макет двух объектных репозиториев в тестах Syfmony PHPUnit - PullRequest
0 голосов
/ 10 мая 2019

Метод из моего MyClass класса, который я хотел бы проверить, выглядит следующим образом:

public function needs()
{
    $domains = $this->em->getRepository(WebDomain::class)->findBy(array(
        'client' => $this->client
    ));

    $hosting = $this->em->getRepository(WebHosting::class)->findBy(array(
        'client' => $this->client
    ));

    if($domains !== null && $hosting !== null){
        return true;
    }

    return false;
}

Глядя на документацию Symfony Я создаю тест, подобный этому:

public function testNeeds()
{
    $em = $this->createMock(ObjectManager::class);
    $client = new Client();

    /**
     * Add WebHosting to Client
     */
    $webHosting = new WebHosting();
    $webHosting->setClient($client);

    /**
     * Create a new WebDomain for Client/WebHosting
     */
    $webDomain = new WebDomain();
    $webDomain->setClient($client);
    $webDomain->setWebHosting($webHosting);

Я знаю, как создать фиктивный репозиторий (например, необходимый $domains):

$domains = $this->createMock(ObjectRepository::class);
$domains->expects($this->any())
    ->method('findBy')
    ->willReturn($client->getWebDomain());

$em->expects($this->any())
    ->method('getRepository')
    ->willReturn($domains);

$myClass = new MyClass($client, $em);

Итак, насколько я понимаю, это создает насмешку, что всякий раз, когда вызывается метод findBy, возвращается $domains, но что мне нужно добавить, чтобы вернуть необходимый $hosting?

Я подозреваю, что это как-то связано с $this->any(), я предполагаю, что мне нужно сузить его до expects(WebDomain::class) (что не работает с).

Так как я довольно новичок в UnitTests в Symfony (и вообще), указание на правильное руководство может также помочь. Спасибо!

1 Ответ

1 голос
/ 10 мая 2019

В вашем случае вы должны вернуть другой Repository в зависимости от аргумента, переданного методу getRepository. Что-то вроде:

$emMock
    ->method('getRepository')
    ->will($this->returnValueMap([
       [WebDomain::class, $webDomainRepositoryMock),
       [WebHosting::class, $webHostingRepositoryMock)
    ]));

Примечание: не забудьте настроить findBy для обоих репозиториев.

...