Модульное тестирование контроллеров Zend с макетами моделей и сервисов - PullRequest
2 голосов
/ 10 ноября 2009

Я прочитал много учебников по тестированию Zend-контроллеров, но не могу найти того, который объясняет, как тестировать контроллер, использующий модели, и издеваться над этими моделями.

У меня есть следующие действия контроллера: -

function indexAction(){
  // Get the cache used by the application
  $cache = $this->getCache(); 

  // Get the index service client and model
  $indexServiceClient = new IndexServiceClient($this->getConfig());
  $indexModel = $this->_helper->ModelLoader->load('admin_indexmodel', $cache);
  $indexModel->setIndexServiceClient($indexServiceClient);

  // Load all the indexes
  $indexes = $indexModel->loadIndexes();

  $this->view->assign('indexes', $indexes);
}

На данный момент у меня есть очень простой тестовый пример: -

public function testIndexActionRoute() {
  $this->dispatch( '/admin/index' );
  $this->assertModule('admin', 'Incorrect module used');
  $this->assertController('index', 'Incorrect controller used');
  $this->assertAction('index', 'Incorrect action used');
}

Этот тест работает, но он вызывает реальные модели и сервисы, что иногда означает, что время ожидания истекло и в тестовой среде произошел сбой. Для правильного модульного тестирования только контроллера мне нужно иметь макеты и ожидания для IndexServiceClient и IndexModel - как это сделать?

Ответы [ 2 ]

4 голосов
/ 11 ноября 2009

Ну, поскольку я не вижу здесь много ответов, я постараюсь добавить свои 2цента (возможно, спорный). Ответ, написанный ниже, является моим IHMO и очень субъективен (и я думаю, что он не очень полезен, но мы все равно поехали)

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

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

Другой способ думать об этом - то, что на самом деле происходит в ваших контроллерах. Опять же, IHMO - это должен быть, прежде всего, связующий уровень между вашей бизнес-логикой и вашим пользовательским интерфейсом. Если вы помещаете много бизнес-логики в контроллер, это будет иметь неблагоприятные последствия (например, это будет нелегко объединить ...).

Это, конечно, всякая теория. Надеюсь, кто-нибудь может дать лучший ответ и показать, как легко подключить контроллер для юнит-тестов!

2 голосов
/ 12 ноября 2009

Одним из возможных решений, предложенных коллегой, является использование помощника действий Zend Controller для внедрения ложных зависимостей. Это должно работать в теории, но мне еще предстоит тщательно протестировать этот метод

Вот пример того, как это делается.

class Mock_IndexModel_Helper extends Zend_Controller_Action_Helper_Abstract {

    private $model;

    public function __construct($model) {
        $this->model = $model;
    }   

    /**
     * Init hook
     */
    public function init() {            
        $this->getActionController()->setIndexModel( $this->model );
    }

}


class IndexControllerTest extends Zend_Test_PHPUnit_ControllerTestCase {

    public $bootstrap = BOOTSTRAP;

    public function setUp(){
        parent::setUp();
    }


    /**
    * Test the correct module/controller/action are used
    */
    public function testIndexAction() {                 
        $mockIndexModel = $this->getMock("IndexModel");

        Zend_Controller_Action_HelperBroker::addHelper(new Mock_IndexModel_Helper($mockIndexModel));

        $this->dispatch( '/admin/index' );

        $this->assertModule('admin', 'Incorrect module used');
        $this->assertController('index', 'Incorrect controller used');
        $this->assertAction('index', 'Incorrect action used');
    }    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...