Diciamo che abbiamo questo metodo:
string Add(int a, int b) {
var sum = _calculator.Add(a,b);
var response = _formatter.Format(sum);
return response;
}
Ora voglio testare unitamente questo metodo. Supponiamo ovviamente che il codice non sia in realtà banale, _calculator e _formatter potrebbero essere servizi esterni, c'è qualche logica nel metodo stesso, e voglio essere sicuro di chiamare tutte le mie dipendenze correttamente e restituire il risultato corretto. Ovviamente _calculator e _formatter verranno derisi, ma cosa dovrei prendere in giro e cosa dovrei verificare? Vedo anche le opzioni -
Imposta i mock per rispondere a qualsiasi input con output specifico e successivamente assicurati che siano stati chiamati con l'input previsto:
calculator = Substitute.For<ICalculator>();
calculator.Add(Arg.Any<int>(), Arg.Any<int>()).returns(123);
formatter = Substitute.For<IFormatter>();
formatter.Format(Arg.Any<int>()).returns("yup");
var subject = new DidntThinkOfClassName(calculator, formatter);
var res = subject.Add(1, 2);
calculator.Received(1).Add(1, 2);
formatter.Received(1).Format(123);
res.ShouldBe("yup");
O configura i mock in SOLO rispondendo all'input previsto, quindi verifica solo il risultato finale:
calculator = Substitute.For<ICalculator>();
calculator.Add(1, 2).returns(123);
formatter = Substitute.For<IFormatter>();
formatter.Format(123).returns("yup");
var subject = new DidntThinkOfClassName(calculator, formatter);
var res = subject.Add(1, 2);
res.ShouldBe("yup");
Nella prima opzione accetto qualsiasi input, ovvero mock più semplici, ma devo verificare le chiamate ricevute. Nella seconda opzione sistemo i miei mock in modo tale che il risultato finale possa essere raggiunto solo se ogni singolo finto ha ricevuto esattamente ciò che è stato configurato per ricevere, quindi ho solo bisogno di controllare il risultato finale.
Cosa diresti è meglio? C'è una soluzione migliore che mi manca?