Nasıl CodeIgniter ile denetleyicileri test için?

5 Cevap php

Ben CodeIgniter MVC çerçevesi ile inşa edilmiş bir PHP web uygulaması var. Ben çeşitli kontrol sınıfları test etmek istiyoruz. I Toast birim test için kullanıyorum. Benim kontrolörleri işledikleri her şey ya oturuma kaydettiğiniz veya görüntülemek için görüntülemek geçirilir, hiçbir devlet var. Bir sahte oturum nesnesi yaratmak ve o düzgün çalışıp çalışmadığını test (sadece sahte bir nesne oluşturmak ve $ controller-> session = $ mock ile enjekte) basittir.

Bilmiyorum ne, manzaralı çalışmak için nasıl. : CodeIgniter'daki, görünümleri olarak yüklenir

$this->load->view($view_name, $vars, $return);

Ben CI kodunu değiştirmek istemiyorsanız bu yana, ben gerçi sahte Loader oluşturmak ve özgün yerini alabilir. Ve burada sorun yatıyor, ben CI_Loader yeni bir sınıf türetmek için bir yol bulamıyorum.

Ben sistemi / kütüphaneleri / Loader.php dosyası dahil etmezseniz, sınıf CI_Loader tanımsız ve ben ondan miras alamaz:

class Loader_mock extends CI_Loader

Ben (require_oncenin kullanarak) dosyası içerir yaparsanız, ben hata alıyorum:

Cannot redeclare class CI_Loader

CI kodu kendisini ne sebeple olursa olsun ikinci require_oncenin kullanmak değil gibi görünüyor.

Herkes burada birim test CodeIgniter çalışan uygulamalar ile deneyimi var mı?

Edit: Ben tanımsız bir mock sınıfa çalışma zamanında gerçek bir yükleyici nesne enjekte ve çağrı __ ile tüm aramaları ve değişkenleri yönlendirme, __ set, __ olsun, __ isset ve __ çalıştı. Ama (ben, gerçi sadece hayır çıktı, yani boş bir sayfa Tost herhangi bir hata alamadım) çalışmak için görünmüyor. İşte kod:

class Loader_mock 
{
    public $real_loader;
    public $varijable = array();

    public function Loader_mock($real)
    {
        $this->real_loader = $real;
    }

    public function __call($name, $arguments) 
    {
        return $this->real_loader->$name($arguments);
    }

    public function __set($name, $value)
    {
        return $this->real_loader->$name = $value;
    }

    public function __isset($name)
    {
        return isset($this->real_loader->$name);
    }

    public function __unset($name)
    {
        unset($this->loader->$name);
    }

    public function __get($name)
    {
        return $this->real_loader->$name;
    }

    public function view($view, $vars = array(), $return = FALSE)
    {
        $varijable = $vars;
    }
}

5 Cevap

Alternatif olarak, bu yapabilirdi:

$CI =& get_instance();
$CI = load_class('Loader');

class MockLoader extends CI_Loader
{
    function __construct()
    {
    	parent::__construct();
    }
}

Sonra denetleyicisi DO $ this-> load = new MockLoader ().

Benim geçerli çözüm require_oncenin kullanmak yerine gerektirecek CodeIgniter kodunu değiştirmek için. İşte ben bunu kabul edene kadar kimse aynı yapmak gerekiyor durumunda CI geliştiriciler göndermek için gidiyorum yama bulunuyor:

diff --git a/system/codeigniter/Common.php b/system/codeigniter/Common.php
--- a/system/codeigniter/Common.php
+++ b/system/codeigniter/Common.php
@@ -100,20 +100,20 @@ function &load_class($class, $instantiate = TRUE)
        // folder we'll load the native class from the system/libraries folder.
        if (file_exists(APPPATH.'libraries/'.config_item('subclass_prefix').$class.EXT))
        {
-               require(BASEPATH.'libraries/'.$class.EXT);
-               require(APPPATH.'libraries/'.config_item('subclass_prefix').$class.EXT);
+               require_once(BASEPATH.'libraries/'.$class.EXT);
+               require_once(APPPATH.'libraries/'.config_item('subclass_prefix').$class.EXT);
                $is_subclass = TRUE;
        }
        else
        {
                if (file_exists(APPPATH.'libraries/'.$class.EXT))
                {
-                       require(APPPATH.'libraries/'.$class.EXT);
+                       require_once(APPPATH.'libraries/'.$class.EXT);
                        $is_subclass = FALSE;
                }
                else
                {
-                       require(BASEPATH.'libraries/'.$class.EXT);
+                       require_once(BASEPATH.'libraries/'.$class.EXT);
                        $is_subclass = FALSE;
                }
        }

Ben test ile size çok yardımcı olamaz, ama CI kütüphane uzatmak yardımcı olabilir.

Siz kendi içinizdeki MY_Loader sınıfı oluşturmak /application/libraries/MY_Loader.php.

<?php
  class MY_Loader extends CI_Loader {

    function view($view, $vars = array(), $return = FALSE) {
      echo 'My custom code goes here';
    }

  }

CodeIgniter otomatik olarak göreceksiniz. Sadece orijinal kütüphanede değiştirmek istediğiniz fonksiyonları koydu. Her şey orijinal kullanacak.

Daha fazla bilgi için CI manual page for creating core system classes check out.

Ben kullanmaya çalıştığınız kod tarafından etkilendim.

Yani şimdi ben CodeIgniter arasında 'Kanca' sınıf sorununuza herhangi bir yardım nasıl olabilir merak ediyorum?

http://codeigniter.com/user_guide/general/hooks.html

Kind regards, Rein Groot

Kontrolör etki mantığı içermemelidir, böylece ünite testleri burada hiçbir mantıklı.

Bunun yerine ben kabul testleri ile denetleyicileri ve görüşlerini test olacaktır.