Zend Framework / PHPUnit: как заглушить / смоделировать объектный метод, который подключается к базе данных? - PullRequest
1 голос
/ 17 июня 2010

В моем проекте Zend Framework у меня есть форма, которую я тестирую. В моей форме элемент с множественным выбором получает свои параметры из модели, которая получает их из базы данных.

public function init()
{
    $this->addElement('select', 'Region_ID', array('multiOptions' => $this->getRegions()));
}

protected function getRegions()
{
    $mapper = new Model_RegionMapper();
    return $mapper->getFormSelectData(); //this method will try to connect to a database (or get another object that will connect to the database)
}

Я попытался скопировать пример в документации PHPUnit, но, похоже, он не работает.

public function setUp()
{
    $stub = $this->getMock('Model_RegionMapper');
    $stub->expects($this->any())
        ->method('getFormSelectData')
        ->will($this->returnValue(array('testdata')));
}

public function testFoo()
{
    //this will fail
    $form = new My_Form();
}

Тест не пройден, поскольку он пытается найти таблицу в базе данных, которая не существует. Но я не хочу, чтобы он вообще подключался к базе данных. Как правильно заглушить / смоделировать этот метод, чтобы он не вызывал базу данных?

Ответы [ 2 ]

3 голосов
/ 17 июня 2010

Создайте макет Model_RegionMapper.

  • Не создавайте Model_RegionMapper в своем классе, а передавайте его вместо этого.
  • При тестировании передайте поддельный Model_RegionMapper, который возвращает тестовые данныедля getFormSelectData ().
0 голосов
/ 21 марта 2014

Я согласен со Sjoerd, так как в этом случае вы тестируете свою форму, а не то, как извлекаются данные, просто создаете фиктивный объект и устанавливаете его возвращаемое значение с информацией, которую вы ожидаете получить в этой ситуации. Хорошей альтернативой PHPUnit Mock Objects является Mockery от Padraic O'Brady . Это капля в альтернативе.

...