Che ne pensi di questo:
$validator= $this->getMock('ValidatorService');
// Set up the expectation for the isValid() method
// to be called only once and with the string 'textToBeValidated'
// as its parameter and returns true or false.
$validator->expects($this->once())
->method('isValid')
->with($this->equalTo('textToBeValidated'))
->will($this->returnValue(true));
Questo è apparso in una revisione del codice in un progetto a cui sto lavorando e l'abbiamo chiamato Stock ( St ub - M ock ). Perchè lo chiedi?!
- Imposta un'aspettativa per
isValid()
di essere chiamato una sola volta e con un determinato input come un Mock. - Restituisce una risposta predefinita come uno Stub.
Ho la sensazione che sia sbagliato, ma cosa succede se usassimo solo uno Stub puro:
$validator->expects($this->any()) //<-- can't fail the test now
->method('isValid')
->will($this->returnValue(true)); //<-- canned answer
- Non riesco a verificare che il metodo
isValid
sia stato chiamato una sola volta con i parametri corretti. - Se il test è passato, non sono sicuro che sia passato per il giusto motivo. Forse
isValid()
è stato chiamato due volte e ha causato il passaggio.
Quindi usiamo un puro Mock invece:
$validator->expects($this->once())
->method('isValid')
->with($this->equalTo('textToBeValidated'))
- Non riesco a verificare che la mia funzione funzioni correttamente, perché ho verificato solo che la chiamata a
isValid()
abbia avuto esito positivo. Forse c'è un bug nel resto del mio codice usandoValidatorService
.
So che alcune persone parleranno della verifica dello stato e del comportamento, ma per come la vedo io, l'unico modo per essere sicuri che il test passi per il motivo giusto è quello di usare uno Stock (cioè verificare il comportamento e lo stato finale) .
Ovviamente l'altra opzione è scrivere 2 test per ogni criterio di test. Uno usa un Mock e un test identico usando uno Stub. Tuttavia, ciò comporterà un TestOverflow (un numero enorme di test quasi identici).
Qual è il modo corretto per eseguire un test concreto di una funzione utilizzando una dipendenza?