繁体   English   中英

如何在 ASP.NET 核心 Web API 的集成测试中使用自定义 DateTime.now?

[英]How to use custom DateTime.now in integration test for ASP.NET Core Web API?

我的项目中有一个应该使用DateTime.Now的集成测试。

这是我的方法:

public static ErrorResult CheckAvailabiliteOfOrderDeliveryInCurrentTime(string openingTime,string closingTime)
{
    var currentTimeString = System.DateTime.Now.ToString("HH:mm:ss"); 

    if (DateTime.Parse(openingTime + ":00") > DateTime.Parse(closingTime + ":00"))
    {
        if ((DateTime.Parse(currentTimeString) <= DateTime.Parse("23:59:00") && 
             DateTime.Parse(currentTimeString) > DateTime.Parse(openingTime + ":00")) || 
            (DateTime.Parse(currentTimeString) < DateTime.Parse(closingTime + ":00") && 
             DateTime.Parse(currentTimeString) >= DateTime.Parse("00:00:00")))
        {
            return ErrorResult.None;
        }
        else
        {
            return ErrorResult.OutOfDeliveryTime;
        }
    }
    else
    {
        if (DateTime.Parse(currentTimeString) < DateTime.Parse(closingTime + ":00") && 
            DateTime.Parse(currentTimeString) > DateTime.Parse(openingTime + ":00"))
        {
            return ErrorResult.None;
        }
        else
        {
            return ErrorResult.OutOfDeliveryTime;
        }
    }
}

我调用此方法的处理程序方法:

public async Task<OrderDto> Handle(CreateOrderCommand request, CancellationToken cancellationToken)
{
    var validator = new CreateOrderCommandValidator();
    var result = await validator.ValidateAsync(request, cancellationToken).ConfigureAwait(false);

    if (!result.IsValid) 
         throw new ValidationException(result);

    var foodBusiness = await _context.FoodBusinesses.FindAsync(Guid.Parse(request.FoodBusinessId));

    if (foodBusiness == null)
        throw new NotFoundException(nameof(FoodBusiness), request.FoodBusinessId);

    if (request.Type == OrderTypes.Delivery)
    {   
        var isOutdeliveryTime = DateTimeHelpers.CheckAvailabiliteOfOrderDeliveryInCurrentTime(foodBusiness.OpeningTime, foodBusiness.ClosingTime);

        if (isOutdeliveryTime == ErrorResult.OutOfDeliveryTime)
        {
            var newOrder = new OrderDto();
            newOrder.errorDeliveryTimeAvailabilite = ErrorResult.OutOfDeliveryTime;

            return _mapper.Map<OrderDto>(newOrder);
        }
        else
        {
            var newOrder = await ExecuteOrderOperations(request, cancellationToken, foodBusiness);
            return _mapper.Map<OrderDto>(newOrder);
        }
    }
    else
    {
        var newOrder = await ExecuteOrderOperations(request, cancellationToken, foodBusiness);
        return _mapper.Map<OrderDto>(newOrder);
    }
}

默认应用程序我们使用System.DateTime.Now ,但在集成测试中,我需要使用我自己的DateTime.Now - 有什么解决方案吗? 谢谢

您的意见是:

  1. 重构代码以使其可测试。 例如,创建一个ISystemClock并让您的单元测试使用模拟。
  2. 购买 Visual Studio Enterprise 并使用 Microsoft Fakes或其他一些第三方解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM