Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZendFramework]Zend + PHPUnit - testy jednostkowe
Forum PHP.pl > Forum > PHP > Frameworki
sweter
Witam,
chciałem napisać testy jednostkowe do swojej nowej aplikacji pisanej w ZF. Przeczytałem już kilka tutoriali w Sieci na ten temat, ale nie mogę sobie poradzić z jednym problemem.
Mianowicie: nie mogę wykorzystać swoich klas, które są przechowywane w ./application/model. Testy przechowuje oczywiście w katalogu ./tests/application/constrollers.

Test, który chcę odpalić wygląda tak:
Kod
require_once 'PHPUnit/Framework/TestCase.php';

class TestControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
{
    private $model = null;
    
    public function setUp(){
        $application = new Zend_Application(APPLICATION_ENV, APPLICATION_PATH . '/configs/application.ini');
        $this->bootstrap = array($application->getBootstrap(), 'bootstrap');
        $this->model = new Application_Model_TagList(100);
        return parent::setUp();
    }
    
    public function testFirst(){
        $this->model->addItem(new Application_Model_Tag('pierwszy_tag'));
        $this->assertEquals(count($this->model->getArray()), 1);
    }

    public function tearDown()
    {
        /* Tear Down Routine */
    }
}


plik ./tests/application/boostrap.php ma taką zawartość:
Kod
set_include_path(implode(PATH_SEPARATOR, array(
            realpath(dirname(__FILE__) . '/../../library'),
            get_include_path(),
        )));

defined('APPLICATION_PATH') || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../../application'));
defined('APPLICATION_ENV') || define('APPLICATION_ENV', 'testing');
defined('APPLICATION_LOAD_TESTDATA') || define('APPLICATION_LOAD_TESTDATA', true);

require_once 'Zend/Loader/Autoloader.php';
$autoloader = Zend_Loader_Autoloader::getInstance();
spl_autoload_unregister(array($autoloader, 'autoload'));

Zend_Loader_Autoloader::resetInstance();
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->registerNamespace('PHPUnit_');


a ./tests/phpunit.xml taką:
  1. <phpunit bootstrap="./application/bootstrap.php"
  2. colors="true"
  3. convertErrorsToExceptions="true"
  4. convertNoticesToExceptions="true"
  5. convertWarningsToExceptions="true"
  6. stopOnFailure="false">
  7.  
  8. <testsuite name="Test_ZF">
  9. <directory>./application/</directory>
  10. </testsuite>
  11. </phpunit>


Test odpalam poleceniem "phpunit" będąc w katalogu ./tests. W odpowiedzi konsola zwraca mi komunikat:
Cytat
szymon@szymon-Vostro-1440:/var/www/tt/tests$ phpunit
PHPUnit 3.6.10 by Sebastian Bergmann.

Configuration read from /var/www/tt/tests/phpunit.xml

.E

Time: 1 second, Memory: 8.25Mb

There was 1 error:

1) TestControllerTest::testFirst
Zend_Db_Table_Exception: No adapter found for Application_Model_DbTable_MomentToTag

/var/www/tt/library/Zend/Db/Table/Abstract.php:755
/var/www/tt/library/Zend/Db/Table/Abstract.php:739
/var/www/tt/library/Zend/Db/Table/Abstract.php:268
/var/www/tt/application/models/TagList.php:15
/var/www/tt/tests/application/controllers/TestControllerTest.php:16

FAILURES!
Tests: 2, Assertions: 1, Errors: 1.


Co mam zrobić, aby móc bezproblemowo używać testów jednostkowych wykorzystujących bibliotekę Zenda i moje klasy?
Proszę o pomoc, bo już nie mam do tego cierpliwości. Z góry dzięki smile.gif

Pozdrawiam
padalec83
Witam,
jak na moje oko brakuje Ci uruchomienia bootstrapa:
  1. public function appBootstrap() {
  2. $this->application = new Zend_Application(APPLICATION_ENV,
  3. APPLICATION_PATH . '/configs/application.ini' );
  4. $this->application->bootstrap();
  5. $oBootstrap = $this->application->getBootstrap();
  6. [b]Zend_Controller_Front::getInstance()->setParam('bootstrap', $oBootstrap);[/b]
  7. }

pogrubiona linijka. W ogóle to chyba najlepiej metody uruchamiające przenieść do osobnej klasy, ja mam coś takiego:
  1. class SmartGroupTestCase extends Zend_Test_PHPUnit_ControllerTestCase
  2. {
  3. /** * @var Zend_Application */
  4. protected $application;
  5.  
  6. public function setUp() {
  7. $this->bootstrap = array( $this, 'appBootstrap' );
  8. parent::setUp();
  9. }
  10.  
  11. public function appBootstrap() {
  12. $this->application = new Zend_Application(APPLICATION_ENV,
  13. APPLICATION_PATH . '/configs/application.ini' );
  14. $this->application->bootstrap();
  15. $oBootstrap = $this->application->getBootstrap();
  16. Zend_Controller_Front::getInstance()->setParam('bootstrap', $oBootstrap);
  17. }
  18. }
  19.  

Pozdrawiam
solr
@padalec: Czemu po prostu nie zrobić tak?

  1. public function setUp() {
  2. $this->bootstrap = new Zend_Application(APPLICATION_ENV, APPLICATION_PATH . '/configs/application.ini');
  3. parent::setUp();
  4. }
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.