PHPUnit ve autoloaders: kodu test kapsamında çalışıyor olmadığının belirlenmesi?

2 Cevap php

Premise

Ben bir test çalıştırdığınızda farklı hareket kod yazma hilariously kötü bir uygulama olduğunu biliyorum, ama aslında gerekli olabilecek bir senaryo rastlamak may've.

Özellikle, Zend çerçevesinde HTML Arıtma için çok özel bir sarıcı test etmek çalışıyorum - Görünüm Yardımcısı, kesin olmalıdır. Biz başka türlü autoloaders için farklı bir mantık kullanır, çünkü HTML Arıtma autoloader gereklidir.

Problem

require()-ing benim Görünüm Yardımcısı sınıfın üstündeki autoloader, bana verir aşağıdaki in test-scope:

HTML Purifier autoloader registrar is not compatible with non-static object methods due to PHP Bug #44144; Please do not use HTMLPurifier.autoload.php (or any file that includes this file); instead, place the code: spl_autoload_register(array('HTMLPurifier_Bootstrap', 'autoload')) after your own autoloaders.

Reklamı gibi spl_autoload_register(array('HTMLPurifier_Bootstrap', 'autoload')) ile require() değiştirilmesi testi iyi çalışır anlamına gelir, ama Görünüm Yardımcısı iddia korkunç bir ölüm ölür:

Zend_Log [3707]: ErrorController "Geçti dizi varolan statik yöntem (sınıf 'HTMLPurifier_Bootstrap' bulunamadı) belirtmiyor" LogicException yakalandı

(Bizim test klasör yapısı gerekliliği bizim Zend klasör yapısı biraz farklıdır.)

Question(s)

Onunla müdahalesi sonra, ben şeyler deney kapsamında olup olmadığına bağlı olarak, bir otomatik yükleyici-yükleme almak gerekir düşünüyorum.

  1. Ben nedeniyle tünel vizyonuna göremiyorum her iki durumda HTMLPurifier en autoloading rutin eklemek için başka bir seçenek var mı?

  2. Eğer değilse, benim kendi kodu (örn. APPLICATION_ENV) ile test ortamı ve üretim ortamında bu ayırt etmek için bir yol bulmak zorunda - Ben kontrol edebilir veya sabit ayarlayarak doğal olarak benim bu godawful hackery destekleyen PHPUnit yok edip onun oldu defined(), veya benzer maskaralık? (My Google-fu burada zayıf! Ben muhtemelen sadece yanlış yapıyorum.)

2 Cevap

HTML Arıtma HTMLPurifier.auto.php ayrı bir dosyaya yerleştirilir kendi autoloading kodu vardır; yani HTMLPurifier_Bootstrap. Özdevinimli_yükle, aslında dosyanın nerede olacağını bir dosya koymak söyler içermeyen bir autoload yanı sıra getPath gerçekleştirir: Bu iki yöntem vardır. Bu dosya açıkça yalnız durmak için tasarlanmıştır.

Ne yazık ki zerdüştlerin kodu hakkında konuşmaya yetkili değilim. Sadece fazladan yapıyor kurtulmak mümkün olabilir kodu denemeden önce Bootstrap içerir. Umarım ki olur!

Hala biraz farklı konfigürasyona sahip - üretim ve test ortamları arasında gereksinimi (değil kimlik varsa) iyi, benzerliğe doğru olmasına rağmen. Ben application.ini den önyükleme yükler farklı bölümlerini ifade ve gibi ben sadece (o autoloader özelliği gibi) on / off sth açmak için bayrağı iletebilirsiniz:

1) I have SetEnv APPLICATION_ENV test in my .htaccess (could be production, development, staging). You can have it in your apache configs as well. 2) When Zend_Config loads application.ini - it loads it according to get_env('APPLICATION_ENV') - so different sections for different scenarios (I actually rely on Zend_Application of course, but it is clever enough to understand the environment) 3) I can always add some flag into respective section and check it from code.

Bu biraz yardımcı olur umarım.