Я пишу несколько модульных тестов (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 волшебным образом заменял любые ссылки на оригиналы моками, так что при вызове отправки вместо них использовались поддельные моки. Этого не происходит. Кто-нибудь может пояснить, как это достигается?