如何解决如何使用It.IsAny <>TValue匹配对象的某些属性?
考虑以下代码。它具有BookingRequest
,其中包含两个属性。接口IBookingRequestProcessor
具有处理BookingRequest
的方法。我想创建一个模拟,该模拟将匹配所有与一个属性匹配的BookingRequest
对象,而其他属性可以是任何值。
为此,我创建了模拟匹配对象,其匹配属性设置为我要匹配的值,其他属性设置为It.IsAny<>()
。但是,我得到Moq.MockException
的原因是All invocations on the mock must have a corresponding setup.
。
完整的代码如下:
using System;
using Moq;
public class Program {
public class BookingRequest
{
public string FlightId { get; set; }
public string BookingId { get; set; }
public BookingRequest() { }
public BookingRequest(string FlightId,string BookingId)
{
this.FlightId = FlightId;
this.BookingId = BookingId;
}
}
public interface IBookingRequestProcessor
{
string ConstantReturn(string param);
int ProcessBooking(BookingRequest bookingRequest);
}
public static void Main(String[] args) {
var bookingRequestMock = new Mock<IBookingRequestProcessor>(MockBehavior.Strict);
bookingRequestMock
.Setup(bp => bp.ConstantReturn(It.IsAny<string>()))
.Returns("AB");
Console.WriteLine(bookingRequestMock.Object.ConstantReturn(Guid.NewGuid().ToString()));
Console.WriteLine("----");
var bookingRequestMatcher = new BookingRequest()
{
FlightId = "AB495",BookingId = It.IsAny<string>()
};
bookingRequestMock
.Setup(bp => bp.ProcessBooking(bookingRequestMatcher))
.Returns(495);
var bookingRequest = new BookingRequest("AB495",Guid.NewGuid().ToString());
Console.WriteLine(bookingRequest.FlightId + " --> " + bookingRequestMock.Object.ProcessBooking(bookingRequest));
}
}
解决方法
模拟对象属性的匹配必须通过Is<TValue>()
处理。您可以通过以下方式根据所需属性进行匹配:
bookingRequestMock
.Setup(bp => bp.ProcessBooking(It.Is<BookingRequest>(br => br.FlightId == "AB495")))
.Returns(495);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。