Как начать тестирование моделей Zend Framework? - PullRequest
2 голосов
/ 08 января 2010

Как начать тестирование моих моделей в приложении Zend Framework 1.8+?

Допустим, у меня настроено приложение для начала тестирования. Я уже проверил контроллер, поэтому я знаю, что он работает. У меня есть все мои контроллеры, расширяющие мой ControllerTestCase.php файл:

<?php
require_once 'Zend/Application.php';
require_once 'Zend/Test/PHPUnit/ControllerTestCase.php';

abstract class ControllerTestCase extends Zend_Test_PHPUnit_ControllerTestCase
{
    public $application;

    public function setUp()
    {
        $this->application = new Zend_Application(
            APPLICATION_ENV,
            APPLICATION_PATH . '/configs/application.ini'
        );

        $this->bootstrap = array($this, 'appBootstrap');
        parent::setUp();
    }

    public function appBootstrap()
    {
        $this->application->bootstrap();
    }

    public function tearDown()
    {
        Zend_Controller_Front::getInstance()->resetInstance();

        $this->resetRequest();
        $this->resetResponse();

        $this->request->setPost(array());
        $this->request->setQuery(array());
        parent::tearDown();
    }
}

Но теперь я хочу начать тестировать свои модели. Кажется, что мой ModelTestCase.php не будет расширять Zend_Test_PHPUnit_ControllerTestCase, а скорее Zend_Test_PHPUnit_ModelTestCase, но такого класса, о котором я знаю, не существует. Как начать тестирование моделей Zend Framework?

1 Ответ

7 голосов
/ 08 января 2010

Для вас предусмотрена база ControllerTestCase, поскольку для настройки и демонтажа среды для тестирования контроллера требуются сложные шаги. Входные данные представляют собой фиктивный HTTP-запрос, а выходные данные представляют собой HTML-код, который необходимо очистить для поиска ожидаемого содержимого.

Модель больше похожа на обычный старый объект PHP. Там меньше среды для настройки. Интерфейс - это просто вызов метода для объекта.

Итак, я бы запустил класс TestCase, который расширяет простое TestCase в PHPUnit, и начал бы с добавления хотя бы одного метода test (в виде пустой функции ) для каждого метода в вашем классе Model , В конечном итоге у вас будет много методов тестирования для каждого метода в вашем классе Model, но создание пустых методов тестирования - это хороший способ не забыть некоторые из ваших методов Model.

Обратите внимание, что модель не является таблицей - модель обычно использует один или несколько объектов таблицы. Следуя этой схеме, у вас есть возможность создать макетные объекты для таблиц, чтобы вы могли запускать набор тестов, не требуя прямого подключения к базе данных.

Вот пример настройки фиктивного объекта Table, который жестко запрограммирован для возврата синтетического набора данных вместо набора данных из базы данных.

<?php

class MyModelTest extends PHPUnit_Framework_TestCase
{
  protected $_model;

  public function setUp()
  {
    $foo = $this->getMock('FooTable', array('find'));
    $foo->expects($this->any())
        ->method('find')
        ->will($this->returnValue(array("id"=>"123")));

    $this->_model = new MyModel();
    $this->_model->setFooTable($foo);
  }

  public function testCountElements()
  {
    $this->_model->get(123);
    $n = $this->_model->countElements();
    $this->assertEquals(1, $n);
  }

  public function testAsArray()
  {
    $this->_model->get(123);
    $a = $this->_model->asArray();
    $this->assertType('array', $a);
  }

  public function testAddElement()
  {
    // ...etc.
  }

  public function testGetElement()
  {
    // ...etc.
  }

}
...