Restituzione di un oggetto fittizio da un oggetto fittizio

3

Sto cercando di restituire un oggetto quando si prende in giro una classe parser. Questo è il codice di prova che utilizza PHPUnit 3.7

    //set up the result object that I want to be returned from the call to parse method
    $parserResult= new ParserResult();
    $parserResult->setSegment('some string');        

    //set up the stub Parser object
    $stubParser=$this->getMock('Parser');
    $stubParser->expects($this->any())
               ->method('parse')
               ->will($this->returnValue($parserResult));

    //injecting the stub to my client class
    $fileWriter= new FileWriter($stubParser);
    $output=$fileWriter->writeStringToFile();

Nel mio metodo writeStringToFile() sto usando $parserResult come questo:

writeStringToFile(){
   //Some code...
    $parserResult=$parser->parse();
    $segment=$parserResult->getSegment();//that's why I set the segment in the test.
}

Devo simulare ParserResult in primo luogo, in modo che il mock restituisca un mock? È un buon design per i mock per restituire mock?

C'è un approccio migliore per fare tutto questo?!

    
posta Songo 14.10.2012 - 15:43
fonte

2 risposte

3

In generale, avere una catena di mock che restituiscono altri mock è considerato un odore di codice nei test.

Detto questo, la risposta se questa è una buona idea è ovviamente "dipende".

Informazioni sul tuo oggetto ParserResult - se si tratta di un oggetto di valore piccolo, costruirlo e passarlo è probabilmente una buona idea.

Se si tratta di un oggetto di grandi dimensioni con dipendenze proprie, allora il fatto di prenderlo in giro sarebbe un'opzione migliore. Non deriderlo aumenterebbe l'accoppiamento nei test.

Un'altra domanda da porre sul design è qual è il risultato di ParserResult.getSegment utilizzato? Forse uno stile Tell Do not Ask potrebbe essere migliore, puoi dire a ParserResult o Parser di fare qualcosa con le informazioni sul segmento invece di estrarlo e poi di operare su di esso?

    
risposta data 15.10.2012 - 02:26
fonte
3

Penso che sia una buona idea prendere in giro il set di dipendenze più piccolo e più vicino possibile alla classe che stai testando. L'idea è di ridurre il test nello scenario più semplice possibile, quindi è facile assicurarsi che il test sia corretto e che solo per testare una cosa.

Se si restituisce una simulazione, si stanno testando due cose separate, la funzione che consuma la simulazione e la classe che ora crea e restituisce la simulazione.

Quindi verifica separatamente il consumatore e il produttore di ParserResult.

    
risposta data 14.10.2012 - 16:32
fonte

Leggi altre domande sui tag