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中文網其他相關文章!