PHPUnit - aynı sınıfın birden taslakları

3 Cevap php

Sınıfta Foo için birim testleri inşa ediyorum ve ben birim test için oldukça yeni.

Benim sınıf temel bileşeni Bar nesnelerin sayısını içeren BarCollection bir örneğidir. Bir toplama yoluyla Foo dolaşır içinde yöntem ve koleksiyonunda her Bar nesne üzerinde bir çift yöntemlerini çağırır. Ben benim test sınıf için tepkilerin bir dizi oluşturmak için saplama nesneleri kullanmak istiyorum. Nasıl ben yineleme gibi Bar saplama sınıf farklı değerler döndürür yapabilirim? Ben bu satırlar boyunca bir şey yapmaya çalışıyorum:

$stubs = array();
foreach ($array as $value) {
    $barStub = $this->getMock('Bar');
    $barStub->expects($this->any())
            ->method('GetValue')
            ->will($this->returnValue($value));
    $stubs[] = $barStub;
}
// populate stubs into `Foo`

// assert results from `Foo->someMethod()`

Yani Foo->someMethod() o Bar nesnelerden aldığı sonuçlara göre veri üretecektir. Dizi bir daha uzun olduğunda, ancak bu bana aşağıdaki hatayı veriyor:

There was 1 failure:

1) testMyTest(FooTest) with data set #2 (array(0.5, 0.5))
Expectation failed for method name is equal to <string:GetValue> when invoked zero or more times.
Mocked method does not exist.
/usr/share/php/PHPUnit/Framework/MockObject/Mock.php(193) : eval()'d code:25

Ben bir düşünce, bir geri çağrı yöntemini çağırmak için ->will($this->returnCallback()) kullanmak için, ama çağrıyı yapıyor Bar nesne geri arama göstermek (ve dolayısıyla ne yanıt nasıl bilmiyorum ) elde edildi.

Başka bir fikir vb 1. ilk kez, 2 ikinci kez dönmek, benim saplama anlatmak için, onConsecutiveCalls() yöntemini, ya da bunun gibi bir şey kullanmak için, ama ben bunu tam olarak nasıl emin değilim. Ben de benim sınıf şimdiye koleksiyonu emretti tekrarında başka bir şey yaparsa, ben bunu test etmek için bir yol olmayacağını endişeleniyorum.

3 Cevap

Ben ne yazık ki getMock() kullanarak gerçek sorunuzu çözebilir eğer emin değilim, ama getMock() kendisi ile benim deneyim incedir.

Ben hazırlıksız düşünüyorum, ama Bar sınıf bilmeden yalnızca şey, bu yardımcı olabilir: getMock() (bir dizi olarak) yapıcı argüman geçmemize izin verir üçüncü parametre.

(Ben seviyorum ve {[içine bunlardan bir dizi enjekte yapar tam olarak ne bir test helper ('yani sadece testlerde kullanılacak olur sadece başka bir sınıf için' süslü isim) gibi Bar uzanan kendi davalarını sınıf oluşturmak istiyorum 0)]} nesne. Düpedüz soruya, getMock() yapmaz yılında yöntemlerinin yerini beri Yani, size istediğiniz tüm kontrolü sağlar. Ben zaten test sınıf başına ayrı bir test sınıf yazıyorum öneririm rağmen, ancak durumlar vardır - elbette da demektir ki ne istediğinizi olmayabilir, bu testte Bar sınıfı, test değil Bu gereksiz yere purist nerede.

$stubs = array();
foreach ($array as $value) {
    $stubs[] = new MyBarTestHelper($value);
}

Bu bir yana, ben dürüst birden fazla dizi elemanı olduğunda sadece istisna tarif görüyoruz şaşırdım. Aslında ne içten yapar kendi uzantısı oluşturmak olduğundan ben, PHPUnit aslında size bir getMock() parametre olarak takip edebilmek için istediğiniz herhangi bir yöntem bildirmek için beklediğini tespit ettik, ve kayıtsızca aksi dışarı hata olacaktır sınıf, size açıkça onu (= mantıksal bir liste haline yöntemi adını ekleyerek) denirdi belirlemenizi sağlar mantığı ile beyan her yöntemi sarma.

Yani (ciddi, muhtemelen kendimi, ben bir test acemi olduğum, ben) bana naif renk, ama bu size herhangi bir yardımcı olmadığını görmek:

$stubs = array();
foreach ($array as $value) {
    $barStub = $this->getMock('Bar', array('GetValue'));
    $barStub->expects($this->any())
            ->method('GetValue')
            ->will($this->returnValue($value));
    $stubs[] = $barStub;
}

Bu küresel kullanımı ile rahat konum eğer denir gibi sırayla değerleri bir dizi dönmek için gereksinimi karşılamak gerekir. Bu Bar denir hiç bir fikrim var ama her Bar düzeni kez Foo denir ise o zaman test verileri doldurmak için çok zor olmamalı.

$barTestData = array('empty',1,2,3,4,5,6);

function barDataCallback(){
    global $barTestData;
    return next($barTestData);
}

"-> Yöntemi ('GetValue')" kodunuzda seni sonra ekstra bir parantez fark ettim. Kopyaladığınız ve o ya da değil yapıştırılan bilmiyorum.