Могу ли я комбинировать shouldReceive и shouldNotReceive в Mockery для теста контроллера в ZF2 с Doctrine Entity Manager?

В настоящее время я работаю над проектом ZF2/Doctrine и пытаюсь настроить и запустить свой пакет PHPUnit. Впервые пытаюсь написать модульные тесты для проекта ZF2, проекта Doctrine, а также впервые работаю с Mockery. Пока все хорошо, но у меня возникла проблема с Doctrine EntityManager;

Я только что издевался над своим Doctrine\Orm\EntityManager и хочу, чтобы вызов getRepository с определенным параметром возвращал фиктивный репозиторий, но я хочу, чтобы вызовы других репозиториев оставались прежними. Я предполагал, что использование shouldReceive и shouldNotReceive рядом друг с другом будет работать, но почему-то я продолжаю получать ошибки;

class ProductControllerTest extends AbstractHttpControllerTestCase
{
    public function testViewAction()
    {
        $serviceLocator = $this->getApplicationServiceLocator();
        $entityManager = \Mockery::mock($serviceLocator->get('Doctrine\ORM\EntityManager'));

        $entityManager
           ->shouldReceive('getRepository')
           ->with('App\Entity\Product')
           ->andReturn(\Mockery::mock('App\Repository\Product'));

        $entityManager
           ->shouldNotReceive('getRepository')
           ->with(\Mockery::not('App\Entity\Product'));

        $serviceLocator
            ->setAllowOverride(true)
            ->setService('Doctrine\ORM\EntityManager', $entityManager);

        $this->dispatch('/products/first-product');

        $this->assertResponseStatusCode(200);
    }
}

Причина, по которой мне нужна эта конкретная вещь, заключается в том, что я просто хочу написать тест для этого фрагмента кода. Некоторый базовый код не идеален, поэтому, пожалуйста, помогите мне сосредоточиться на этой части, но я хочу иметь возможность реорганизовать базовые фрагменты кода без нарушения работы моего приложения. Нужно с чего-то начать, чтобы сделать мое приложение полностью тестируемым;)

Но есть ли в моей логике что-то ошибочное или я что-то упускаю? Большое спасибо!


person Steven Dijkerman    schedule 11.03.2016    source источник


Ответы (1)


Вы можете попробовать что-то вроде этого. Идея состоит в том, чтобы сначала настроить ожидание по умолчанию, используя byDefault(), а затем определить ваши конкретные ожидания, которые будут предпочтительнее, чем по умолчанию.

$entityManager
    ->shouldReceive('getRepository')
    ->with(\Mockery::any())
    ->andReturn(\Mockery::mock('Doctrine\ORM\EntityRepository'))
    ->byDefault();

$entityManager
    ->shouldReceive('getRepository')
    ->with('App\Entity\Product')
    ->andReturn(\Mockery::mock('App\Repository\Product'));
person Bram Gerritsen    schedule 12.03.2016