DateTime.Now
:最佳实践单元测试往往需要控制系统时间来模拟各种场景。 直接更改系统时钟是不切实际且有风险的。 解决方案在于依赖注入和抽象。
关键是抽象时间源并将其注入到您的代码中。这样可以在测试期间轻松用模拟替换实时提供程序。
让我们创建一个界面:
<code class="language-csharp">interface ITimeProvider { DateTime UtcNow { get; } }</code>
该接口定义了一个获取当前UTC时间的合约。 我们将使用默认类来实现它:
<code class="language-csharp">class DefaultTimeProvider : ITimeProvider { public DateTime UtcNow => DateTime.UtcNow; }</code>
现在,让我们在依赖类中使用它:
<code class="language-csharp">class MyDependentClass { private readonly ITimeProvider _timeProvider; public MyDependentClass(ITimeProvider timeProvider) { _timeProvider = timeProvider; } public void MyMethod() { var currentTime = _timeProvider.UtcNow; // ... use currentTime ... } }</code>
在测试中,您可以注入模拟 ITimeProvider
返回预定的 DateTime
值,从而在测试中提供对时间的完全控制。
或者,可以使用环境上下文:
<code class="language-csharp">public static class TimeContext { private static ITimeProvider _current = new DefaultTimeProvider(); public static ITimeProvider Current { get => _current; set => _current = value; } }</code>
这提供了一个全球可访问的时间提供者。 在测试中,您可以暂时将 TimeContext.Current
设置为模拟,并记住在每次测试后将其恢复为默认值,以避免副作用。
记住:每次测试后清理环境上下文,以防止后续测试或应用程序本身出现意外后果。 为此,强烈建议使用 using
语句或 finally
块。
以上是如何有效地对依赖于'DateTime.Now”的代码进行单元测试?的详细内容。更多信息请关注PHP中文网其他相关文章!