finta istanza appena creata?
-
05-07-2019 - |
Domanda
ho un vecchio codice che non utilizzava TDD ora voglio scrivere un test per una funzione simile a questa
function somefunction($someargs){
// do a few checks on $someargs
$database = new DB_PG();
$result = $database->select($query);
// do some changes on result
return $result;
}
dal momento che non sono molto espirato con phpunit e test in generale la mia domanda è: come posso prendere in giro DB_PG? ho provato getMock () nel mio test, ma poiché la funzione usa " new " per ottenere un'istanza il mio oggetto simulato viene ignorato, il che ha senso
quindi vedo solo 2 opzioni
- alcune caratteristiche di phpunit che non conosco - che è il motivo per cui chiedo qui ^^
- devo modificare il vecchio codice - che so sarebbe meglio
quindi, qualcuno conosce una risposta per l'opzione 1?
grazie a tutti
Soluzione
OPZIONE 1
Puoi cambiare la funzione in modo che funzioni come segue:
function someFunc($existingArgs, $db = null)
{
$db = (is_null($db)) = new DB_PG();
$result = $db->select($query)
$return $result;
}
In questo modo puoi passare in un'istanza db, questo ti consente almeno di testare questa funzione, in futuro puoi refactificare cose in modo che il lavoro di SomeFunc sia sui modelli e il carico del db avvenga tramite un dao / repository / factory .
OPZIONE 2
Se DB_PG non è già inserito tramite un requisito / includi nel file in cui risiede questa funzione, è possibile definire una classe fittizia all'interno della classe di test
class DB_PG
{
public function select($query)
{
//use phpunit's libs to output a mock object, you'll need to use the PHPUnit_Framework_Mock::generate() static method, I think that's the name.
return $mockResult;
}
}
In questo modo puoi controllare cosa succede con il risultato.