【问题标题】:How can I test/mock external code or external dependencies using moq?如何使用 moq 测试/模拟外部代码或外部依赖项?
【发布时间】:2021-04-12 05:52:01
【问题描述】:

我在单元测试中使用 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);

它正确地向我返回了响应。 但我的问题是 proxy.AutoCancelBooking(request); 函数中有很多场景和类要测试。

我如何测试或模拟这些类和依赖项。

【问题讨论】:

  • 要测试AutoCancelBooking,您不必模拟IMonitorBookingServiceProxy,而是创建实现接口的类并为其提供外部依赖项(通过模拟那些依赖项实例)。然后你可以创建测试用例来检查AutoCancelBooking的逻辑实现。

标签: c# asp.net-mvc unit-testing mocking moq


【解决方案1】:

你说IMonitorBookingServiceProxy.AutoCancelBooking请求函数内部有很多场景需要测试。您是要测试IMonitorBookingServiceProxy.AutoCancelBooking 中的功能,还是要根据IMonitorBookingServiceProxy.AutoCancelBooking 返回的不同响应来测试ExecuteRequest 的功能?

【讨论】:

  • 我想测试 MonitorBookingServiceProxy.AutoCancelBooking 的功能
  • 在这种情况下,您应该按照@oleksa 的说明进行操作。如果您想测试IMonitorBookingServiceProxy.AutoCancelBooking,您可能还会有一个实现此接口的类。该类将在其构造函数中注入依赖项。您必须模拟这些依赖项并设置它们的行为以测试实现 IMonitorBookingServiceProxy.AutoCancelBooking 的类中的执行路径。
【解决方案2】:

模拟的目的是删除依赖项来测试你的代码,所以,在我的代码中

/// <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,这是无法模拟的依赖项,这就是为什么我们将生成模拟响应并从上述函数返回它的原因。我已经做得对了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 2019-01-18
    • 2020-04-08
    • 2018-01-21
    • 1970-01-01
    相关资源
    最近更新 更多