Assegnazioni con valori di ritorno simulati

2

(mostrerò esempi usando php e phpunit ma questo può essere applicato a qualsiasi linguaggio di programmazione)

Il caso: diciamo che abbiamo un metodo A::foo che delega un po 'di lavoro alla classe M e restituisce il valore così com'è.

Quale di queste soluzioni sceglieresti:

$mock = $this->getMock('M');
$mock->expects($this->once())
     ->method('bar')
     ->will($this->returnValue('baz'));

$obj = new A($mock);

$this->assertEquals('baz', $obj->foo());

o

$mock = $this->getMock('M');
$mock->expects($this->once())
     ->method('bar')
     ->will($this->returnValue($result = 'baz'));

$obj = new A($mock);

$this->assertEquals($result, $obj->foo());

o

$result = 'baz';
$mock = $this->getMock('M');
$mock->expects($this->once())
     ->method('bar')
     ->will($this->returnValue($result));

$obj = new A($mock);

$this->assertEquals($result, $obj->foo());

Personalmente seguo sempre la seconda soluzione, ma solo 10 minuti fa ho avuto una conversazione con un paio di sviluppatori che hanno detto che è "troppo difficile" e ha scelto il 3 ° o il 1 °.

Quindi cosa faresti di solito? E hai qualche convenzione da seguire in questi casi?

    
posta zerkms 07.06.2012 - 12:36
fonte

2 risposte

5

Scelgo la terza soluzione per due motivi:

  1. Avendolo definito come %codice% rende possibile assegnare un valore diverso a $ risultato dopo.

  2. Proprio perché il secondo metodo è troppo complicato. Penso che sia importante che il codice sia leggibile e comprensibile da altri il più possibile senza commenti.

risposta data 07.06.2012 - 12:46
fonte
2

IMHO tutti e 3 gli approcci vanno bene
considerando tutti e tre i casi 1. Si restituisce un valore ('baz') e quindi si applica l'asserzione usando lo stesso valore.
2. Stai restituendo una variabile che stai assegnando mentre restituisci la stessa.
3. Hai una variabile assegnata in precedenza ($ result = 'baz') che restituisci e quindi usi la stessa variabile per l'asserzione.

La tua seconda strategia è un po 'complicata perché assegni il valore della variabile durante il tempo di ritorno.
Considerando, in generale, se la mia funzione non riesce ad essere eseguita. Quindi provare a utilizzare $ result variable in qualsiasi altro luogo oltre l'asserzione non ha senso dato che non è assegnato.
Mentre negli altri 2 casi posso usare direttamente il valore ('baz') o usare il risultato $ variabile.

    
risposta data 07.06.2012 - 14:24
fonte

Leggi altre domande sui tag