Domanda

Durante il tentativo di testare una base di codice legacy, mi sono imbattuto in un oggetto che procede come segue:

class Foo
{
    public function __construct($someargs)
    {
        $this->bar = new Bar();
        // [lots more code]
    }
}

La barra in questo caso ha un costruttore che fa delle cose cattive, ad es. connettersi a un database. Sto cercando di concentrarmi su come testare questa classe Foo, quindi l'ho cambiata in qualcosa del genere:

class Foo
{
    public function __construct($someargs)
    {
        $this->bar = $this->getBarInstance();
        // [lots more code]
    }

    protected function getBarInstance()
    {
        return new Bar();
    }
}

E ho provato a testarlo tramite il seguente test PHPUnit:

class FooTest extends PHPUnit_Framework_TestCase
{
    public function testInstance()
    {

        $bar = $this->getMock('Bar');
        $foo = $this->getMock('Foo', array('getBarInstance'));
        $foo->expects($this->any())
            ->method('getBarInstance')
            ->will($this->returnValue($bar));

    }

}

Comunque questo non funziona - il costruttore di Foo () viene chiamato prima che venga aggiunto my - > Expects (), quindi il metodo getBarInstance () beffato restituisce un valore nullo.

Esiste un modo per scollegare questa dipendenza senza dover riformattare il modo in cui la classe usa i costruttori?

È stato utile?

Soluzione

Usa l'argomento $ callOriginalConstructor di getMock () . Impostalo su false . È il quinto argomento del metodo. Cerca qui: http: // www .phpunit.de / manuale / corrente / it / API.html # api.testcase.tables.api

In realtà, aspetta. Vuoi passare un finto a un finto? Se lo vuoi davvero, usa il terzo argomento di getMock che rappresenta gli argomenti per il costruttore. Lì puoi passare la derisione di Bar alla derisione di Foo .

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