【问题标题】:How can I update the server time dynamically from c# code [duplicate]如何从 C# 代码动态更新服务器时间 [重复]
【发布时间】:2021-08-06 03:33:15
【问题描述】:

我有一个持续的测试管道,单元和集成测试必须在 PR 上通过,然后代码才能合并。

它在减少错误和稳定我们的代码库方面非常出色,但我们遇到了时间问题。

在周末,构成此堆栈的多个应用程序会明确检查不允许在周末提交新订单。更糟糕的是,其中一些应用程序使用 DateTime.Now 进行这些检查,并且如果没有大型重构就无法模拟。

是否有可能在 c# 中在我们的测试中发出一个命令来更新“服务器时间”,以便我们的大多数测试都可以工作?

【问题讨论】:

  • 如果时间是您需要测试的系统变量,那么您需要重构以便伪造它。

标签: c# unit-testing datetime time server-timing


【解决方案1】:

Try this.

也就是说,使用适当的数据结构调用 WinAPI 函数SetSystemTime

不要忘记将服务器时间返回“正确”!

[当然,假设您的服务器是 Windows,而您没有提到...]

【讨论】:

    【解决方案2】:

    简短的回答是否定的。如果您想围绕一些基本界面进行调整,您要么需要设置操作系统并在测试运行之前更改时间(这可能会产生非常不可预测的结果),要么模拟它。其实很简单:

    不要使用 DateTime.Now/UtcNow,而是使用您的显式版本。

    public interface IDateTimeManager
    {
        DateTime Now {get;}
    }
    

    代码库中的任何位置:

    var now = _dateTimeManager.Now;
    

    在测试设置中:

    var mockDateTimeManager = new Mock<IDateTimeManager>();
    mockDateTimeManager.Setup(x=> x.Now).Returns(new DateTime(2000,1,1));
    

    在设置中:

    var container = new Container();
    container.RegisterSingleton<IDateTimeManager>(mockDateTimeManager.Object);
    

    如果您是应用程序单独的可执行文件/服务,您可以传递一个设置此管理器初始值的参数:

    myapp.exe --start-date "2000-01-01"

    public interface IDateTimeManager
    {
        DateTime UtcNow { get; }
    }
    internal sealed class DateTimeManager : IDateTimeManager
    {
        private readonly DateTime _initialTime;
        private readonly DateTime _initialOsTime;
        public DateTime UtcNow => _initialTime + (DateTime.UtcNow - _initialOsTime);
    
        public DateTimeManager(DateTime initialTime)
        {
            _initialTime = initialTime;
            _initialOsTime = DateTime.UtcNow;
    
        }
    }
    

    附言

    在这种情况下,控制反转是你最好的朋友。

    我得出的结论是,将特定于操作系统的方法替换为我自己的接口比在测试环境中进行修改更容易。例如,在我的项目中,出于同样的原因,所有 File 命名空间经常被嘲笑。我可以用这种方式模拟任何行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-07
      • 1970-01-01
      • 1970-01-01
      • 2011-03-09
      • 2012-10-25
      相关资源
      最近更新 更多