2010-11-11 12 views
6

Testlerim var ve sınıflarımın istisnaları doğru zamanda attığını test etmek istiyorum. Örnekte, benim sınıf __get() sihirli yöntemini kullanır, bu yüzden geçersiz özellik alındığında bir özel durum olduğunu test etmek gerekir: ama yerine, olması gerektiği gibiPHPUnit beklenen istisnaları yakalamıyor

function testExceptionThrownWhenGettingInvalidProperty() { 
    $obj = new MyClass(); 
    $this->setExpectedException("Property qwerty does not exist"); 
    $qwerty = $obj->qwerty; 
} 

sınıf bir hata atar Sadece bir geçiş olsun, istisna yakalanmadı!

There was 1 error: 

1) QueryTest::testExceptionThrownWhenGettingInvalidProperty 
Exception: Property qwerty does not exist 

önce SimpleTest kullanarak, ve $this->expectException(new Exception("Property qwerty does not exist")); gayet güzel çalıştı. Diğer yöntemlerin (@expectedException ve try-catch) olduğunu biliyorum, ancak bu işe yarayacak ve çok daha temiz görünüyor. Bunu nasıl yapabileceğime dair herhangi bir fikrin var mı? Eğer SPL Exceptions kullanarak veya özel istisna sınıfları yaparken bu istisna metnin aramıyor

cevap

13

, bu ... istisna sınıfının adını Docs

$this->setExpectedException('Exception'); 

bakıyor Oldukça kullanışlı .. . ircmaxell cevabı ekleme

+0

Teşekkürler! Bunu tamamen göz ardı ettim çünkü bunu yapmanın SimpleTest yöntemine alıştım. Metni test etmenin kolay bir yolu var mı? –

+0

@Nathan, @ircmaxell: Cevabımı gör, metin testi de dahil olmak üzere bunu yapmanın daha iyi bir yolu var. – ryeguy

+0

@ircmaxell: Önemli olmayan mesaja katılmıyorum. Çıkan her yeni hata için yeni bir istisna oluşturan iyi tasarlanmış dil veya çerçeve görmüyorsunuz. Bu çok fazla iş olurdu. – ryeguy

13

, aslında bunu yapmanın basit bir yolu vardır:

/** 
* @expectedException MyExceptionClass 
* @expectedExceptionMessage Array too small 
*/ 
public function testSomething() 
{ 
} 

@expectedException beklediğiniz istisnanın sınıf adı ve @expectedExceptionMessage beklediğiniz istisna mesajının bir alt dizisidir (doğru, iletinin tamamını almak zorunda değilsiniz).

Belgeleme ek açıklamalarını kullanmayı tercih etmiyorsanız, bunların her ikisi de, gerçekten de, bu örnek olayda yöntemler olarak kullanılabilir.

+4

+1… '@expectedExceptionMessage' ın farkında değildim. docblock element ... Her gün yeni bir şeyler öğrenin ... – ircmaxell

+0

@ircmaxell: Evet, biraz önce kendimi keşfettim. "Ek Açıklamalar" ekinin dışında herhangi bir yerde söz konusu değildir. O zaman bile, üzerinde hiçbir doküman yok, sadece adını listeler. – ryeguy

+0

çok güzel - teşekkürler! – jmadsen