Zend_Test koşum Zend Framework denetleyicisi yürütürken doğru InvokeArg ayarlanması

2 Cevap php

this posta listesi tartışma göre, Zend MVC denetleyicisi uygulama kaynaklara erişmek için önerilen yol:

$this->getInvokeArg('bootstrap')->getResource('foo');

(Ilgili Web sayfasında gezinirken) Bu üretimde çalışır. Zend_Test_PHPUnit_ControllerTestCase ile bu kodu içeren bir denetleyicisi eylem test Ancak, ben alıyorum:

PHP Fatal error: 12 hattı olmayan bir nesne olarak ... / application / controllers / IndexController.php bir üye işlev GetResource () Çağrı

O getInvokeArg şeyi tanıtan kadar, testler sadece iyi koştu. Soru nasıl test koşum kaynakların iş erişim "tavsiye" yol yapabilirsiniz, nedir?

Sadece kontrol: $this->getFrontController()->getParam('bootstrap')->getResource('foo') ya da çalışmıyor.

GÜNCELLEME: phpunit --bootstrap ./scripts/application_bootstrap.php ... ile uygulama ön yükleme diyorlar ve ben bunu gayet iyi biliyorum yürütür.

Ve orada var:

$application = new Zend_Application(
    APPLICATION_ENV,
    APPLICATION_PATH . '/configs/application.ini'
);

$application->bootstrap();

2 Cevap

Edit: Ben senin sorunun etrafında ilk kez o kısmını üzgünüm cevapsız ediyorum (henüz kahve!). Ben cevap düzenlenebilir ettik.

Sorun şu ki, Zend_Test_PHPUnit_ControllerTestCase birim test denetleyicileri içindir yatıyor. Bu çerçevenin kalanından very birkaç bağımlılıkları kullanmak için, ve otomatik olarak büyük uygulama (farkında değildir ve) ne olursa olsun / / ön yükleme çalışmaz çalışır.

Lütfen önyükleme yok çünkü temelde, getResouce, çalışmıyor.

Eğer etrafında bir göz atacak olursak Zend_Test_PHPUnit_ControllerTestCase bunu manuel ayarlar ve kullanımları Zend_Controller_Front, ve her bir test için kendi istek / yanıt nesneleri başlatır görürsünüz. Bu bir fonksiyonel veya entegrasyon testi, mümkün olduğunca unit test kadar çok olması girişiminde bulunuyor.

Sorununuzu çözmek için, test paketi how uygulama bootstrap için söylemek zorundayım. Bunu başarmak için bir kaç yolu var.

Bir, halkın test sınıfının bootstrap özellik için bir dosya atayabilirsiniz.

public $bootstrap = '/path/to/bootstrap/file.php'

Bu Zend_Application kullanan uygulamalar için iyi bir seçenektir.

Ya da, bootstrap özelliğine bir geri sağlayarak:

public function setUp()
{
    // Use the 'start' method of a Bootstrap object instance:
    $bootstrap = new Bootstrap('test');
    $this->bootstrap = array($bootstrap, 'start');
    parent::setUp();
}

Not: Eğer geçersiz eğer ebeveyn setUp yöntemini çağırmak için gerçekten çok önemli.

Edit 2: Tamam, sen are aslında uygulama önyükleyebilir. Yani, yukarıda yapmış ve hala bir şans var.

Ben ön yükleme almasını sağlamak için, TestCase dispatch yöntemi geçersiz öneriyoruz. (Bu kesin çalışacağız).

public function dispatch($url = null)
{
    $this->getFrontController()->setParam('bootstrap', $yourBootstrap);
    parent::dispatch($url);
}

Düşününce gel, muhtemelen o setUp yanı yapabilirdi.

Bu test paketi düzgün Zend_Application tarafından inşa edilmiş bir ön denetleyicisi davranışını taklit sağlayacaktır. Ön yükleme erişim Her iki yöntem de şimdi çalışmalıdır.

Ön yükleme gerekli bir kontrol eklentisi kullanırken ben aynı sorunu koştu.

Temelde ben soyut bir sınıf yarattı ve ondan miras.


abstract class My_ControllerTestCase extends Zend_Test_PHPUnit_ControllerTestCase
{
    protected $application;

    public function setUp()
    {


        $this->bootstrap = array($this, 'appBootstrap');


        return parent::setUp();
    }

    public function appBootstrap()
       {

        $this->application = new Zend_Application(APPLICATION_ENV, APPLICATION_PATH . '/config/app.ini');

        $this->application->bootstrap();

        $bootstrap = $this->application->getBootstrap();

        $front = $bootstrap->getResource('FrontController');

        $front->setParam('bootstrap', $bootstrap);

       }
}

Sonra aşağıdaki gibi kullanabilirsiniz:


class MyControllerTest extends My_ControllerTestCase
{

}

Ben de bu işlevselliği ZF ayrı haline gelmiş bir istek giriş

[ZF-7373]: (http://framework.zend.com/issues/browse/ZF-7373) -

Yorum bırakmak dahil bu vurgulamak için yardımcı olacaktır.