Chúng tôi đang sử dụng Moq để kiểm tra các lớp dịch vụ của chúng tôi, nhưng bị mắc kẹt về cách kiểm tra các tình huống mà một phương thức dịch vụ gọi một phương thức dịch vụ khác của cùng một lớp. Tôi đã thử thiết lập các phương pháp được gọi là ảo, nhưng vẫn không thể tìm ra những gì để làm sau đó trong Moq. Ví dụ:Sử dụng Moq để ghi đè các phương thức ảo trong cùng một lớp
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;
}
}
Trong ví dụ trên, phương pháp GetNextRenewalDate của chúng tôi khá phức tạp và chúng tôi đã kiểm tra đơn vị đó. Tuy nhiên, chúng tôi muốn thử nghiệm IsLastRenewalOfYear đơn giản hơn mà không cần phải giả lập mọi thứ cần thiết cho GetNextRenewalDate. Về cơ bản, chúng tôi chỉ muốn thử GetNextRenewalDate.
Tôi nhận ra rằng tôi có thể tạo một lớp mới ghi đè GetNextRenewalDate và kiểm tra lớp mới, nhưng có cách nào mà tôi có thể tận dụng Moq để làm cho điều này đơn giản hơn không?
Điều này dường như hoạt động ... Tôi thậm chí không cần phải làm mọi thứ ảo (tôi chỉ giữ nó giống như trên). – Andrew
@Andrew. Các công trình trên vì 'Mock.CallBase == true' có nghĩa là các lời gọi không khớp với một thiết lập sẽ gọi thực hiện bên dưới. Vì vậy, 'IsLastRenewalOfYear' sẽ gọi triển khai thực hiện, vì nó không phải ảo, nhưng' GetNextRenewalDate' sẽ trả về 'null' vì thiết lập sẽ luôn luôn được khớp. Đoạn mã sau sẽ hoạt động ngay cả khi 'IsLastRenewalOfYear' ** là ** virtual. –
chúng tôi sử dụng điều này ở một vài nơi khác nữa, làm việc như một sự quyến rũ. Cảm ơn! – Andrew