如何使用最小起订量 test/mock 外部代码或外部依赖项?
How can I test/mock external code or external dependencies using moq?
我正在使用 Moq 在单元测试中模拟我的代码。在没有外部依赖的情况下模拟代码是可以的。下面的代码是我嘲笑的最后一个依赖项
/// <summary>
/// Executes the request.
/// </summary>
/// <param name="booking">The booking.</param>
protected override void ExecuteRequest(BookingModel.Booking booking)
{
var request = this.CreateRequest(this.TravelContext, booking);
using (var proxy = this.TravelContext.CreateProxy<IMonitorBookingServiceProxy>())
{
var response = proxy.AutoCancelBooking(request);
this.AddResponseInfos(response.ResponseInfos);
}
}
我这样模拟上面的代码
// mock the IMonitorBookingServiceProxy
Mock<IMonitorBookingServiceProxy> mockedMonitorBookingContext = new Mock<IMonitorBookingServiceProxy>() { DefaultValue = DefaultValue.Mock };
mockedMonitorBookingContext.Setup(x => x.AutoCancelBooking(It.IsAny<AutoCancelBookingRequest>())).Returns(autoCancelBookingResponse).Verifiable();
ProxyFactory.Configure<IMonitorBookingServiceProxy>(mockedMonitorBookingContext.Object);
这是return对我的正确回应。
但我的问题是在 proxy.AutoCancelBooking(request);
函数中有很多场景和 类 需要测试。
我如何测试或模拟 类 和依赖项。
你说在IMonitorBookingServiceProxy.AutoCancelBooking
请求函数里面有很多场景需要测试。您要测试 IMonitorBookingServiceProxy.AutoCancelBooking
内的功能还是要根据 IMonitorBookingServiceProxy.AutoCancelBooking
返回的不同响应测试 ExecuteRequest
的功能?
模拟的目的是删除依赖项以测试您的代码,因此,在我的代码中
/// <summary>
/// Executes the request.
/// </summary>
/// <param name="booking">The booking.</param>
protected override void ExecuteRequest(BookingModel.Booking booking)
{
var request = this.CreateRequest(this.TravelContext, booking);
using (var proxy = this.TravelContext.CreateProxy<IMonitorBookingServiceProxy>())
{
var response = proxy.AutoCancelBooking(request);
this.AddResponseInfos(response.ResponseInfos);
}
}
当我调用 proxy.AutoCancelBooking(request);
时,它会调用 Web API 这是不能被模拟的依赖项,这就是为什么我们将生成模拟响应并从上面 return 它功能。我已经做对了。
我正在使用 Moq 在单元测试中模拟我的代码。在没有外部依赖的情况下模拟代码是可以的。下面的代码是我嘲笑的最后一个依赖项
/// <summary>
/// Executes the request.
/// </summary>
/// <param name="booking">The booking.</param>
protected override void ExecuteRequest(BookingModel.Booking booking)
{
var request = this.CreateRequest(this.TravelContext, booking);
using (var proxy = this.TravelContext.CreateProxy<IMonitorBookingServiceProxy>())
{
var response = proxy.AutoCancelBooking(request);
this.AddResponseInfos(response.ResponseInfos);
}
}
我这样模拟上面的代码
// mock the IMonitorBookingServiceProxy
Mock<IMonitorBookingServiceProxy> mockedMonitorBookingContext = new Mock<IMonitorBookingServiceProxy>() { DefaultValue = DefaultValue.Mock };
mockedMonitorBookingContext.Setup(x => x.AutoCancelBooking(It.IsAny<AutoCancelBookingRequest>())).Returns(autoCancelBookingResponse).Verifiable();
ProxyFactory.Configure<IMonitorBookingServiceProxy>(mockedMonitorBookingContext.Object);
这是return对我的正确回应。
但我的问题是在 proxy.AutoCancelBooking(request);
函数中有很多场景和 类 需要测试。
我如何测试或模拟 类 和依赖项。
你说在IMonitorBookingServiceProxy.AutoCancelBooking
请求函数里面有很多场景需要测试。您要测试 IMonitorBookingServiceProxy.AutoCancelBooking
内的功能还是要根据 IMonitorBookingServiceProxy.AutoCancelBooking
返回的不同响应测试 ExecuteRequest
的功能?
模拟的目的是删除依赖项以测试您的代码,因此,在我的代码中
/// <summary>
/// Executes the request.
/// </summary>
/// <param name="booking">The booking.</param>
protected override void ExecuteRequest(BookingModel.Booking booking)
{
var request = this.CreateRequest(this.TravelContext, booking);
using (var proxy = this.TravelContext.CreateProxy<IMonitorBookingServiceProxy>())
{
var response = proxy.AutoCancelBooking(request);
this.AddResponseInfos(response.ResponseInfos);
}
}
当我调用 proxy.AutoCancelBooking(request);
时,它会调用 Web API 这是不能被模拟的依赖项,这就是为什么我们将生成模拟响应并从上面 return 它功能。我已经做对了。