2016-11-08 28 views
5

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

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

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

因此,解決方案將可能是由某個自定義函數,然後返回一個對象,我可以根據需要改變來交換這個GetTimeZoneInformation()功能。但我不知道該怎麼做,我也不知道這是否正常工作,因爲它可能只在應用程序啓動時調用此函數一次。

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

如果我還沒有找到一個已經存在的職位,解決了我的問題,然後我真的很抱歉,因爲我沒有找到它,或者我沒有得到這可以幫助我。

+1

它看起來像你想我們爲你寫一些代碼。儘管許多用戶願意爲遇險的編碼人員編寫代碼,但他們通常只在海報已嘗試自行解決問題時才提供幫助。證明這一努力的一個好方法是包含迄今爲止編寫的代碼,示例輸入(如果有的話),期望的輸出以及實際獲得的輸出(控制檯輸出,回溯等)。您提供的細節越多,您可能會收到的答案就越多。檢查[FAQ]和[問]。 –

回答

0

正如你在你的問題中提到的,嘲笑是解決這個問題的好方法。

我知道的最快,最簡單的方法是通過包裝所有你想在一個新的類,它實現「戰略」的設計模式來測試方法:

它可以真正的實現和嘲笑,曾經之間切換你將邏輯設置爲模擬,它會返回一個模擬值。

默認情況下,它應該設置爲真正的實現。

簡單的例子用「詮釋美孚()」:

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的每次調用更改爲新的戰略, 做到這一點的最簡單的方法,將辛格爾頓的設計模式。

它不具有高風險和變化,你需要做的是改變從「富()」來調用「StrategyImplementation ::的GetInstance()。美孚()」