2015-08-09 15 views
10

Sto davvero correndo in un muro di mattoni con questo. Come passi i valori di classe tra i test in phpunit?phpunit: Come faccio a passare i valori tra i test?

Test 1 -> valore di set,

Test 2 -> legge il valore

Ecco il mio codice:

class JsonRpcBitcoinTest extends PHPUnit_Framework_TestCase 
{ 
    public function setUp(){ 
     global $configRpcUser, $configRpcPass, $configRpcHost, $configRpcPort; 

     $this->bitcoindConn = new JsonRpcBitcoin($configRpcUser, $configRpcPass, $configRpcHost, $configRpcPort); 
     $this->blockHash = ''; 
    } 

    /** 
    * @depends testCanAuthenticateToBitcoindWithGoodCred 
    */ 
    public function testCmdGetBlockHash() 
    { 
     $result = (array)json_decode($this->bitcoindConn->getblockhash(20)); 
     $this->blockHash = $result['result']; 
     $this->assertNotNull($result['result']); 
    } 

    /** 
    * @depends testCmdGetBlockHash 
    */ 
    public function testCmdGetBlock() 
    { 
     $result = (array)json_decode($this->bitcoindConn->getblock($this->blockHash)); 
     $this->assertEquals($result['error'], $this->blockHash); 
    } 
} 

testCmdGetBlock() non sta ottenendo il valore di $this->blockHash che dovrebbe essere impostato in testCmdGetBlockHash().

L'aiuto nella comprensione di ciò che è sbagliato sarebbe molto apprezzato.

risposta

18

Il metodo setUp() viene sempre chiamato prima dei test, quindi anche se si imposta una dipendenza tra due test, qualsiasi variabile impostata in setUp() verrà sovrascritta. Il modo in cui i dati PHPUnit passando opere è dal valore di ritorno di un test al parametro dell'altro:

class JsonRpcBitcoinTest extends PHPUnit_Framework_TestCase 
{ 
    public function setUp(){ 
     global $configRpcUser, $configRpcPass, $configRpcHost, $configRpcPort; 

     $this->bitcoindConn = new JsonRpcBitcoin($configRpcUser, $configRpcPass, $configRpcHost, $configRpcPort); 
     $this->blockHash = ''; 
    } 


    public function testCmdGetBlockHash() 
    { 
     $result = (array)json_decode($this->bitcoindConn->getblockhash(20)); 
     $this->assertNotNull($result['result']); 

     return $result['result']; // the block hash 
    } 


    /** 
    * @depends testCmdGetBlockHash 
    */ 
    public function testCmdGetBlock($blockHash) // return value from above method 
    { 
     $result = (array)json_decode($this->bitcoindConn->getblock($blockHash)); 
     $this->assertEquals($result['error'], $blockHash); 
    } 
} 

Quindi, se avete bisogno di risparmiare di più lo stato tra le prove, tornare più dati in quel metodo. Direi che la ragione per cui PHPUnit rende fastidioso è scoraggiare i test dipendenti.

See the official documentation for details.

+0

Fantastico! Grazie mille, non ho idea di come non l'ho capito. – Drazisil

6

È possibile utilizzare una variabile statica all'interno di una funzione ... PHP fastidiosamente quote variabili statiche dei metodi di classe con tutte le istanze ... Ma in questo cas può aiutare: p

protected function &getSharedVar() 
{ 
    static $value = null; 
    return $value; 
} 

... 

public function testTest1() 
{ 
    $value = &$this->getSharedVar(); 

    $value = 'Hello Test 2'; 
} 


public function testTest2() 
{ 
    $value = &$this->getSharedVar(); 

    // $value should be ok 
} 

NB: questo NON è il modo migliore, ma aiuta se hai bisogno di alcuni dati in tutti i tuoi test ...

+0

Sono impressionato questo funziona! –

+0

Molto utile quando è necessario ottenere o impostare la configurazione per tutti i test della classe. Non esiste un metodo chiamato con contesto di sessione come * setUpPage * solo una volta prima di tutti i test della classe. Ho ragione? –

+0

Alla fine ho trovato * public static function setUpBeforeClass() * ma questo viene chiamato prima che la classe di test sia istanziata. –

Problemi correlati