Sto provando a verificare se un metodo protetto viene chiamato in un'interfaccia pubblica.Verifica se è stato chiamato un metodo protetto
<?php
abstract class SomeClassAbstract
{
abstract public foo();
public function doStuff()
{
$this->_protectedMethod();
}
protected function _protectedMethod();
{
// implementation is irrelevant
}
}
<?php
class MyTest extends PHPUnit_Framework_TestCase
{
public function testCalled()
{
$mock = $this->getMockForAbstractClass('SomeClass');
$mock->expects($this->once())
->method('_protectedMethod');
$mock->doStuff();
}
}
So che viene chiamato correttamente, ma PHPUnit dice che non è mai stato chiamato.
Lo stesso accade quando prova dall'altra parte, quando un metodo è mai chiamato:
<?php
abstract class AnotherClassAbstract
{
abstract public foo();
public function doAnotherStuff()
{
$this->_loadCache();
}
protected function _loadCache();
{
// implementation is irrelevant
}
}
<?php
class MyTest extends PHPUnit_Framework_TestCase
{
public function testCalled()
{
$mock = $this->getMockForAbstractClass('AnotherClass');
$mock->expects($this->once())
->method('_loadCache');
$mock->doAnotherStuff();
}
}
Il metodo si chiama ma PHPUnit dice che non lo è.
Cosa sto facendo male?
Edit ho non't dichiarando i miei metodi con doppi due punti, è stato solo per denotare che si trattava di un metodo pubblico (interfaccia). Aggiornato a tutte le dichiarazioni di classe/metodi.
Edit 2 avrei dovuto dire che sto testando alcune implementazioni di metodo in una classe astratta (a cura del codice per riflettere questo). Dal momento che non riesco a creare un'istanza della classe, come posso testarla?
Sto pensando di creare un SomeClassSimple
estendendo SomeClassAbstract
e testarlo invece. È l'approccio giusto?
Grazie Ewan, proprio tu sei.Naturalmente se si tratta di un oggetto fittizio non ha l'implementazione del metodo. Quanto muto io. Segnerò la tua risposta come corretta. Se puoi, per favore, vedi la mia seconda modifica. –
Quindi quello che sto cercando di testare è l'implementazione, non il comportamento, giusto? È un po 'più chiaro per me, grazie. –
L'analisi delle unità è, penso, più un'arte di quanto sembri. L'ho apprezzato di più dopo aver letto xUnit Test Patterns: Refactoring Test Code di Gerard Meszaros. A sua volta, il libro era una forte raccomandazione di Sebastian Bergmann, l'autore di PHPUnit. –