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

  1. alcune caratteristiche di phpunit che non conosco - che è il motivo per cui chiedo qui ^^
  2. devo modificare il vecchio codice - che so sarebbe meglio

quindi, qualcuno conosce una risposta per l'opzione 1?

grazie a tutti

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top