簡體   English   中英

C ++:如何使用谷歌測試在單元測試中模擬不同的時區

[英]C++: How to simulate different timezones in unit tests using google test

我正在使用C ++進行Google測試以進行單元測試。 在我們的公司代碼中,我們仍然存在問題,系統數據類型(例如CTime)使用例如實際系統的時區(我們使用CTime數據類型與生產代碼中的方式相同)。 對於單元測試,我們想要模擬不同的時區,因為我們遇到了很多問題。

我已經投入了數小時研究其他人如何做到這一點,因為它不可能,其他公司沒有這個問題:)但我沒有找到解決方案。 我的想法是這樣的:CTime本身節省了UTC的時間,並根據需要將其轉換為當地時間。 我的假設是所有這些函數都需要在timezonapi.h中聲明的GetTimeZoneInformation()函數。

WINBASEAPI
_Success_(return != TIME_ZONE_ID_INVALID)
DWORD
WINAPI
GetTimeZoneInformation(_Out_ LPTIME_ZONE_INFORMATION lpTimeZoneInformation);

所以解決方案可能是通過自定義函數交換此GetTimeZoneInformation()函數,然后返回一個我可以根據需要更改的對象。 但我不知道該怎么做,我也不知道這是否有效,因為它可能只是在應用程序啟動時調用此函數一次。

有誰知道如何處理這個話題? 我不想改變任何行為,我只想在不破壞任何時間計算機制的情況下設置我自己的時區。 最好的辦法是,如果我能以某種方式模擬這些調用而不改變生產代碼。 問題是這個程序非常大,老了,而且......盡可能少地改變總是最好的:)

如果我沒有找到解決我問題的現有帖子,那么我真的很抱歉,因為我要么沒有找到它,要么我沒有得到它可以幫助我。

正如您在問題中提到的,模擬是解決此問題的好方法。

我所知道的最快和最簡單的方法是將所有要測試的方法包裝在一個新類中,該類實現了“策略”設計模式:

它可以在實際實現和模擬之間切換,一旦你將邏輯設置為模擬,它將返回一個模擬值。

默認情況下,應將其設置為實際實現。

'int Foo()'的簡單示例:

    Class Strategy{
            int Foo() = o
    }

    Class StrategyImplementation
    {
    private:
            Strategy* logic;
    public:
            void SetLogic(Strategy* newLogic){logic=newLogic)}
            int Foo(){return logic->Foo()}
    }

    Class mock : public Strategy{
    public:
            SetValue(int value){this.value = value}
            int Foo(){return value}
    private:
            int value;
        }

    Class Implementation  : public Strategy{
        int Foo(){ here_you_call_the_method_you_want_to_test }
    }

剩下的就是將GetTimeZoneInformation的每次調用更改為新策略,最簡單的方法是使用“Singleton”設計模式。

它沒有高風險,您需要做的更改是將調用從'Foo()'更改為'StrategyImplementation :: GetInstance()。Foo()'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM