Модульное тестирование Zend Controller и имитация некоторых выполненных действий

Я пишу несколько модульных тестов (PHPUnit 3.6) для своих контроллеров и хочу убедиться, что выполняются правильные действия и т. д.. Это достаточно легко. Однако некоторые из контроллеров также выполняют определенные действия через модели, которые нежелательны, такие как вставка записей в базу данных.

Я знаю, что мне нужно издеваться над ними, но не знаю, как это сделать. Возьмем следующий пример контроллера (урезанный для ясности):

public function addAction()
{
    $data = $this->getRequest()->getPost();
    $model = $this->getModelFactory()->getCompetitionModel()->insert($data);    }

}

Обратите внимание, все, что я хочу сделать, это проверить, что правильный контроллер и действие были отправлены, но не хочу, чтобы запись действительно была вставлена.Точно так же у меня есть эквиваленты для удаления и т. Д. Я не хочу, чтобы записи действительно удалялись.

Что на самом деле нужно здесь высмеивать? Конкурентная модель, адаптер базы данных, фабрика моделей или все три? Как мне ввести их? Я пробовал (снова урезал для краткости):

public function testAddActionIsDispatched()
{
    $this->request->setMethod('POST');
    $this->request->setPost(array($data…));

            $modelMock = $this->getMockBuilder('Competition_Adder')
                 ->disableOriginalConstructor()
                 ->getMock();                


            $factoryMock = $this->getMockBuilder('ModelFactory')
                    ->disableOriginalConstructor()
                    ->getMock(); 

        // Configure the stub.
            $factoryMock->expects($this->any())
                ->method('getCompetitionModel')
                ->will($this->returnValue($modelMock));        

            $modelMock->expects($this->once())
                    ->method('insert')
                    ->will($this->returnValue(true));

            $this->dispatch('/mymodule/add/');
            $this->assertController('test');
            $this->assertAction('add');  
            $this->assertResponseCode(200);
}

}

Насколько я понял, PHPUnit волшебным образом заменял любые ссылки на оригиналы моками, так что при вызове отправки вместо них использовались поддельные моки. Этого не происходит. Кто-нибудь может пояснить, как это достигается?

5
задан John Royal 29 March 2012 в 16:05
поделиться