Estamos utilizando Moq para probar nuestras clases de servicio, pero estamos atascados en cómo probar situaciones donde un método de servicio llama a otro método de servicio de la misma clase. Intenté configurar el método que se llama a virtual, pero todavía no podía averiguar qué hacer en Moq. Por ejemplo:Usando Moq para anular los métodos virtuales en la misma clase
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;
}
}
En el ejemplo anterior, nuestro método GetNextRenewalDate es bastante complicado, y ya hemos probado que la unidad. Sin embargo, queremos probar el IsLastRenewalOfYear más simple sin necesidad de burlar todo lo necesario para GetNextRenewalDate. Básicamente, solo queremos simular GetNextRenewalDate.
Me doy cuenta de que podría crear una clase nueva que anule GetNextRenewalDate y probar la nueva clase, pero ¿hay alguna manera de aprovechar Moq para simplificar?
Esto parece funcionar ... Ni siquiera necesito hacer que todo sea virtual (solo lo mantuve igual que el anterior). – Andrew
@Andrew. Lo anterior funciona porque 'Mock.CallBase == true' significa que las invocaciones que no coinciden con una configuración llamarán a la implementación subyacente. Por lo tanto, 'IsLastRenewalOfYear' llamará a la implementación, porque no es virtual, pero' GetNextRenewalDate' devolverá 'null' porque la configuración siempre coincidirá. El siguiente código funcionará incluso si 'IsLastRenewalOfYear' ** es ** virtual. –
usamos esto en un par de otros lugares también, funcionó como un encanto. ¡Gracias! – Andrew