Test dei consumatori di strutture dati sottoclasse

0

Il SplQueue di PHP non include una funzione clear () o reset () per cancellare i dati fuori dalla struttura dei dati. La mia applicazione richiede quella funzionalità. Questo lascia due opzioni:

A) Crea una sottoclasse di SplQueue. Esempio:

class UserQueue extends SplQueue
{
  public function clear() {
    //dequeue everything
  }
}

Il problema con questo approccio è che non riesco a vedere un modo per testare consumatori di questa sottoclasse senza fare affidamento su clear () come definito nella sottoclasse. In sostanza, non riesco a pensare a un modo per smantellare quella funzionalità in PHP, a meno che non dipenda solo dai test di UserQueue.

B) Implementa la funzione clear () in ogni utente di SplQueue che lo richiede (la maggior parte dei consumatori nella mia applicazione), che sembra ovviamente terribile ma sembrerebbe essere l'unico metodo testabile.

Spero che qualcuno là fuori possa dirmi che c'è un modo ovvio per testare l'opzione A che ho perso. Ho anche preso in considerazione il wrapping di SplQueue, ma non vedo come questo migliori le cose. Oppure potrei scomunicare con runkit , ma un'avversione quasi allergica a runkit mi è stata battuta .

    
posta Daniel Ingraham 04.03.2014 - 22:57
fonte

1 risposta

0

Dopo aver affrontato questo problema con altre persone del mio team per alcuni giorni, la migliore (unica) soluzione per un ambiente TDD purista che potremmo inventare è iniettare la struttura dati come un oggetto fittizio, bloccare il chiaro / ripristinare la funzione e fornirgli una chiusura da eseguire di conseguenza. Fortunatamente PHP e PHPUnit supportano questo. Non è una soluzione incredibile, ma funziona.

Esempio PHPUnit:

$userQueueMock = $this->getMockBuilder('ProjectNamespace\UserQueue')
->setMethods(array('clear'))->getMock();

$userQueueMock->expects($this->once())->method('clear')
->return($this->returnCallback(function() { foreach($this->queue as $entry){}});

Spero che questo aiuti qualcun altro!

    
risposta data 08.03.2014 - 07:26
fonte

Leggi altre domande sui tag