Eğer Birim Testi bir ORM kullanan bir App ile nasıl yapabilirim?

4 Cevap php

Ben birim test üzerinde çeşitli soruları baktım ama özellikle bu soruya cevap bulamıyor.

Buna benzeyen fonksiyonları içeren çeşitli PHP sınıfları var:

    static function _setSuspended($Suspended, $UserID)
    {
        try {
            $con = Propel::getConnection();

            $c1 = new Criteria();
            $c1->add(DomainsPeer::USERID,$UserID);

            $update = new Criteria();
            $update->add(DomainsPeer::SUSPENDED,$Suspended);

            BasePeer::doUpdate($c1, $update, $con);

            return true;
        } catch(PropelException $e) {
            return $e->getMessage();
        }
    }

Benim ORM Propel kullanıyorum. Ben 'alay' ve 'izmarit' yaratma hakkında konuşmak çeşitli birim test konularda okumaya ve ne değildir ama özellikle yukarıda nasıl gibi bir işlevi sınamak için size söyler bir şey bulmak mümkün değil ettik.

Benim düşünce gibi bir şey gider: Ben bu yüzden onu aramak isterim yukarıda fonksiyonunu test etmek gerekir. Ama ben onu aramak, eğer ORM Propel kullanır ve Birim Test esaslara göre kendisi tarafından her işlevi izole edilmelidir.

Ben sadece bunu yapmak için bir yol göremiyorum. Ben burada ne eksik?

4 Cevap

Ben ORM yapılandırma test geçmez çünkü ORM alaycı bana herhangi bir güven vermez buldum. ORMS'nin ayrıca ünite testleri ile yanlış güven verebilir bir mesafe etkileri eylem sürü var. Veritabanı sürücüsünü alaycı ya da bellek veri tabanında bir alternatif sunmak bana kodu doğru ve yaklaşık olarak sert ORM alaycı olduğu gibi çok daha yüksek güven veriyor.

SQLite birim test için büyük bir bellek veritabanı. Bu PDO desteklenen veritabanı listesinde. (PDO uskur 1.3 veritabanı sürücüsü.) Bir bellek içi veritabanı kullanmak istemiyorsanız, bir PDO sahte zaten yazılı bulmak mümkün olabilir.

Bu benim ve tüm sadece biraz daha PHP aşina uskur aşina değilim ki bir genel cevaptır. Temel cevap size bağımlılık enjeksiyon kullanmaktır. Bunun yerine ORM doğrudan atıfta, aslında kullanmak için sınıf / işlevi sarıcı enjekte sonra, onun etrafında bir sarıcı oluşturmak. Birim test yapmak, o zaman ORM için yüzlemez sargının bir sahte veya sahte sürümünü oluşturmak ancak bunun yerine size metot çağrımı için sarıcı gelen yanıtları yapılandırmanızı sağlar. Bu cihaz işlevlerini test zaman ORM dışarı faktör sağlar.

Ben son zamanlarda Misko Hevery's blog about testing çok okuyordum. Bu durum kapsar; Eğer DI (bağımlılık enjeksiyon) kullanmanız gerekiyordu.

Ben de bu biraz kendime mücadele ediyorum ve ben de Propel kullanın.

Biri için, yerine eş daha "Nesne" sınıfına "askıya" yöntemini hareket olabilir. Zaten bu özel işlev için, bunu başarmak için statik yöntemleri kullanmak gerekmez. API gibi görünebilir:

MyObjectPeer::retrieveByPK(1)->suspend();

Bu normal bir birim test yöntemleri ile test edilebilir olacaktır.

Gerçekten test edilmesi gereken veritabanı varsa, o AFAIK aslında DB test yer olması gerekir. Ben ltree kullanarak ve benim geçerli projede bir çok PostGIS ve benim testleri dahil etmek dışında DB bağlıdır modeli mantığı için birim testleri çalıştırmak için başka bir yol düşünemiyorum duyuyorum.

Ben bir PHPUnit plugin for Symfony inşa ederken aynı sorunu çözmek için çalışıyordu. Ayrı bir veritabanı / bağlantıyı kullanın ve yok etmek ve her testten önce onu yeniden - I Django's test framework benzer yaklaşıyor sona erdi.

Ben de (bir test açıkça kendisine talimat ya da eğer) sadece bir test vadede ilk test öncesi test veritabanı yeniden paçayı mümkün olduğunu bulundu; diğer testlerden önce, sadece bir küçük şeyler hızlandırmak için tüm verileri siler.