Nous utilisons Moq pour tester nos classes de service, mais nous sommes bloqués sur la façon de tester les situations où une méthode de service appelle une autre méthode de service de la même classe. J'ai essayé de définir la méthode appelée virtuelle, mais je n'arrivais toujours pas à savoir quoi faire dans Moq. Par exemple:Utilisation de Moq pour remplacer les méthodes virtuelles dans la même 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;
}
}
Dans l'exemple ci-dessus, notre méthode de GetNextRenewalDate est assez compliqué, et nous avons déjà testé l'unité. Cependant, nous voulons tester le plus simple IsLastRenewalOfYear sans avoir besoin de se moquer de tout ce qui est nécessaire pour GetNextRenewalDate. Fondamentalement, nous voulons juste se moquer de GetNextRenewalDate.
Je me rends compte que je pourrais créer une nouvelle classe qui remplace GetNextRenewalDate et tester la nouvelle classe, mais est-il possible de tirer parti de Moq pour rendre cela plus simple?
Cela semble fonctionner ... Je n'avais même pas besoin de tout rendre virtuel (je l'ai juste gardé le même que ci-dessus). – Andrew
@Andrew. Ce qui précède fonctionne parce que 'Mock.CallBase == true' signifie que les invocations qui ne correspondent pas à une configuration appellent l'implémentation sous-jacente. Ainsi, 'IsLastRenewalOfYear' appellera l'implémentation, parce que ce n'est pas virtuel, mais' GetNextRenewalDate' renverra 'null' car le programme d'installation sera toujours reconnu. Le code suivant fonctionnera même si 'IsLastRenewalOfYear' ** est ** virtuel. –
nous avons utilisé cela dans quelques autres endroits aussi, travaillé comme un charme. Merci! – Andrew