Stiamo utilizzando Moq per testare le nostre classi di servizio, ma siamo bloccati su come testare situazioni in cui un metodo di servizio chiama un altro metodo di servizio della stessa classe. Ho provato a impostare il metodo chiamato in virtuale, ma ancora non riuscivo a capire cosa fare in Moq. Per esempio:Uso di Moq per sovrascrivere i metodi virtuali nella stessa classe
public class RenewalService : IRenewalService
{
//we've already tested this
public virtual DateTime? GetNextRenewalDate(Guid clientId)
{
DateTime? nextRenewalDate = null;
//...<snip> a ton of already tested stuff...
return nextRenewalDate;
}
//but want to test this without needing to mock all
//the methods called in the GetNextRenewalDate method
public bool IsLastRenewalOfYear(Renewal renewal)
{
DateTime? nextRenewalDate = GetNextRenewalDate(renewal.Client.Id);
if (nextRenewalDate == null)
throw new Exceptions.DataIntegrityException("No scheduled renewal date, cannot determine if last renewal of year");
if (nextRenewalDate.Value.Year != renewal.RenewDate.Year)
return true;
return false;
}
}
Nell'esempio di cui sopra, il nostro metodo GetNextRenewalDate è piuttosto complicata, e abbiamo già testato unità. Tuttavia, vogliamo testare IsLastRenewalOfYear più semplice senza dover simulare tutto ciò che è necessario per GetNextRenewalDate. Fondamentalmente, vogliamo solo prendere in giro GetNextRenewalDate.
Mi rendo conto che potrei creare una nuova classe che sostituisce GetNextRenewalDate e testare la nuova classe, ma c'è un modo in cui posso sfruttare Moq per rendere più semplice questo?
Questo sembra funzionare ... Non ho nemmeno bisogno di rendere tutto virtuale (l'ho solo mantenuto come sopra). – Andrew
@Andrew. Quanto sopra funziona perché 'Mock.CallBase == true' significa che le chiamate che non corrispondono a una configurazione chiameranno l'implementazione sottostante. Quindi, 'IsLastRenewalOfYear' chiamerà l'implementazione, perché non è virtuale, ma' GetNextRenewalDate' restituirà 'null' perché l'impostazione verrà sempre abbinata. Il seguente codice funzionerà anche se 'IsLastRenewalOfYear' ** è ** virtuale. –
abbiamo usato questo in un altro paio di posti, ha funzionato come un fascino. Grazie! – Andrew