Soyut bir sınıfın somut yöntemlerini PHPUnit ile nasıl test edebilirim?
Testin bir parçası olarak bir tür nesne yaratmamı beklerdim. Yine de, bunun için en iyi uygulama veya PHPUnit buna izin veriyorsa hiçbir fikrim yok.
Soyut bir sınıfın somut yöntemlerini PHPUnit ile nasıl test edebilirim?
Testin bir parçası olarak bir tür nesne yaratmamı beklerdim. Yine de, bunun için en iyi uygulama veya PHPUnit buna izin veriyorsa hiçbir fikrim yok.
Yanıtlar:
Soyut sınıfların birim testi, soyut sınıfların somut yöntemlere sahip olabileceği ve bu somut yöntemlerin test edilebileceği için arayüzü test etmek anlamına gelmez.
Bazı kütüphane kodlarını yazarken, uygulama katmanınızda genişletmeyi beklediğiniz bazı temel sınıflara sahip olmak çok nadir değildir. Ve eğer kütüphane kodunun test edildiğinden emin olmak istiyorsanız, soyut sınıfların somut yöntemlerini UT'ye getirmeniz gerekir.
Şahsen, PHPUnit kullanıyorum ve bu tür şeyleri test etmenize yardımcı olmak için saplamalar ve sahte nesneler olarak adlandırdı.
Doğrudan PHPUnit kılavuzundan :
abstract class AbstractClass
{
public function concreteMethod()
{
return $this->abstractMethod();
}
public abstract function abstractMethod();
}
class AbstractClassTest extends PHPUnit_Framework_TestCase
{
public function testConcreteMethod()
{
$stub = $this->getMockForAbstractClass('AbstractClass');
$stub->expects($this->any())
->method('abstractMethod')
->will($this->returnValue(TRUE));
$this->assertTrue($stub->concreteMethod());
}
}
Sahte nesne size birkaç şey verir:
Bu iyi bir soru. Ben de bunu arıyordum.
Neyse ki, PHPUnit'in getMockForAbstractClass()
bu durum için zaten bir yöntemi var, örn.
protected function setUp()
{
$stub = $this->getMockForAbstractClass('Some_Abstract_Class');
$this->_object = $stub;
}
Bunun PHPUnit> 3.5.4 sürümünü gerektirdiğini unutmayın. Önceki sürümlerde bir hata oluştu .
En yeni sürüme geçmek için:
sudo pear channel-update pear.phpunit.de
sudo pear upgrade phpunit/PHPUnit
PHP 7'den itibaren anonim sınıflar için destek eklendiğine dikkat edilmelidir . Bu, PHPUnit'e özgü işlevselliğe bağlı olmayan soyut bir sınıf için bir test ayarlamak için ek bir yol sağlar.
class AbstractClassTest extends \PHPUnit_Framework_TestCase
{
/**
* @var AbstractClass
*/
private $testedClass;
public function setUp()
{
$this->testedClass = new class extends AbstractClass {
protected function abstractMethod()
{
// Put a barebones implementation here
}
};
}
// Put your tests here
}
Eran, yönteminizin çalışması gerekir, ancak gerçek koddan önce testi yazma eğilimine karşı gelir.
Önereceğim şey, testlerinizi söz konusu soyut sınıfın soyut olmayan bir alt sınıfının istenen işlevselliği üzerine yazmak, ardından hem soyut sınıfı hem de uygulayan alt sınıfı yazmak ve sonunda testi çalıştırmaktır.
Testleriniz, soyut sınıfın tanımlı yöntemlerini açık bir şekilde test etmelidir, ancak her zaman alt sınıf aracılığıyla.
Nelson'ın cevabı yanlış.
Soyut sınıflar, tüm yöntemlerinin soyut olmasını gerektirmez.
Uygulanan yöntemler test etmemiz gereken yöntemlerdir.
Yapabileceğiniz şey, birim test dosyasında sahte bir saplama sınıfı oluşturmak, soyut sınıfı genişletmesini sağlamak ve yalnızca hiçbir işlevsellik olmadan gerekli olanları uygulamak ve elbette bunu test etmektir.
Şerefe.