首頁 >後端開發 >C++ >如何有效地對依賴「DateTime.Now」的程式碼進行單元測試?

如何有效地對依賴「DateTime.Now」的程式碼進行單元測試?

Susan Sarandon
Susan Sarandon原創
2025-01-12 08:01:42170瀏覽

How Can I Effectively Unit Test Code Dependent on `DateTime.Now`?

單元測試和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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn