Ho uno scenario simile a questo:
public class VatCalculator
{
public decimal GetValueWithVat(decimal value, decimal? vatRatePercentage)
{
if(vatRate == null)
{
return value;
}
return value * (1 + (vatRate / 100));
}
}
public ReceiptGenerator
{
private readonly VatCalculator _vatCalculator;
public ReceiptGenerator(VatCalculator vatCalculator)
{
_vatCalculator = vatCalculator;
}
public Receipt GenerateReceipt(Item purchasedItem, decimal? vatRate)
{
var receipt = new Receipt();
receipt.PriceBeforeVat = purchasedItem.Price
receipt.PriceAfterVat = _vatCalculator.GetValueWithVat(purchasedItem.Price, vatRate)
}
}
In questo caso, ho alcuni test di unità che vorrei scrivere, ad es.
- Se non viene fornita alcuna aliquota IVA, il valore "Prezzo dopo IVA" deve essere uguale al prezzo dell'articolo acquistato.
- Se viene fornita un'aliquota IVA, il valore "Prezzo Dopo IVA" deve essere regolato di conseguenza
La mia domanda è se dovrei scrivere questi test unitari a livello della classe ReceiptGenerator
o della classe VatCalculator
.
Se provo al livello di classe ReceiptGenerator
ciò significa che ho test più duraturi; Il codice di GenerateReceipt
può essere refactored, ad es. utilizzare un metodo privato o un'API e i test dovrebbero ancora passare senza modifiche. Ma questo mi sembra uno spazio troppo grande per un test unitario, la mia comprensione è che dovrebbe essere un test focalizzato molto granulare
Se eseguo il test al livello VatCalculator
, posso utilizzare quella classe in altri utenti (ad esempio, se trasferisco la mia attività online, posso utilizzarla per fornire prezzi on-the-go per i clienti che navigano su un prodotto) senza dover testare i consumatori stessi.