We are using Moq to unit test our service classes, but are stuck on how to test situations where a service method calls another service method of the same class. I tried setting the method being called to virtual, but still couldn't figure out what to do then in Moq. For example:
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; } }
In the above example, our GetNextRenewalDate method is pretty complicated, and we've already unit tested it. However, we want to test the simpler IsLastRenewalOfYear without needing to mock everything needed for GetNextRenewalDate. Basically, we just want to mock GetNextRenewalDate.
I realize that I could create a new class that overrides GetNextRenewalDate and test the new class, but is there a way that I can leverage Moq to make this simpler?
You cannot override a non-virtual or static method. The overridden base method must be virtual , abstract , or override . An override declaration cannot change the accessibility of the virtual method. Both the override method and the virtual method must have the same access level modifier.
Yes, you need to use the override keyword, otherwise the method will be hidden by the definition in the derived class.
If a method is declared as a virtual method in the base class, then it's not always required by the derived class to override that method i.e. its optional to override a virtual method in the derived class.
You cannot override a non-virtual method. Virtual properties behave like virtual methods, except for the differences in declaration and invocation syntax. It is an error to use the virtual modifier on a static property.
You can probably use partial mocking in this scenario, although all your methods would need to be virtual:
var mock = new Moq.Mock<RenewalService>(); mock.Setup(m => m.GetNextRenewalDate(It.IsAny<Guid>())).Returns(null); mock.CallBase = true; var results = mock.Object.IsLastRenewalOfYear(...);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With