【发布时间】:2017-08-31 00:51:12
【问题描述】:
我有一个相当大的代码库,其中散布着一堆 DateTime.UtcNow、许多其他调用和 TimeSpan 等。
现在我们正在引入带有计时器等的任务,我需要以变速运行系统进行调试,比如一天是 5 分钟,等等。
由于有很多事情取决于时间,我不能到处改变逻辑,我可以做两件事:
- 在 Visual Studio 中创建一个假程序集,以便我替换 DateTime;或者,
- 我可以简单地将所有 DateTime 调用更改为我自己的类,该类通常只返回 DateTime 的结果。
但是,归根结底,它归结为编写 DateTime 的替代品,并且由于代码使用的不仅仅是 DateTime.UtcNow,如果可能的话,我想找到一个现有的解决方案。
有谁知道这样的事情是否存在?目前还没有发现
【问题讨论】:
-
你这个可怜的东西。这几乎是不可能的。您正在处理具有
static方法的框架的核心类。您将需要为DateTime创建一个外观 - 比如NearlyImpossibleDateTime- 并将所有调用推送到底层DateTime- 然后将所有出现的DateTime替换为NearlyImpossibleDateTime。然后对您的代码进行静态分析以确保没有更多的DateTime。然后你可以拨弄NearlyImpossibleDateTime来改变时间的流逝。但所有这一切都将非常脆弱。祝你好运! -
我现在正在研究的策略是看看我是否能找到 Datetime 的来源,因为 .net 现在是开源的;然后将代码用作假程序集;我很确定这一切都是基于滴答声,也许只是改变分隔线可以让 make 让时间运行得更快.. 但到目前为止这只是一个想法,不知道这是否可行
-
绝对不要尝试创建“假”程序集。这不仅会使测试的有效性受到质疑,而且试图在不搞砸其他调用的情况下伪造系统组件,我想这将是一场噩梦。最多,也许您可以使用仅用于 DateTime 调用的命名空间别名(也称为使用别名),然后使用您的自定义函数临时将其更改为命名空间。这可能仍然不是一个理想的解决方案,但比我认为的伪造装配要好。
-
如果我只需按下 Turbo 按钮让一切运行得更快,我就会怀念我那令人敬畏的 286 系统。你没有turbo按钮是吗? :)
-
@Thomas - 你不能伪造整个 mscorlib 程序集。您的所有代码都会中断。如果你有源,你可以尝试重新创建
DateTime,但它包含的内容远远超过你需要使用的内容。这就是为什么我建议创建一个外观 - 它会容易一百万倍(尽管它仍然非常困难)。