2016-11-08 4 views
5

私はユニットテストのためにGoogleテストでC++で作業しています。私たちの会社のコードでは、システムのデータ型は、例えば、実際のシステムのタイムゾーン(例えば、プロダクションコードのようにCTimeデータ型を使用します)を使用します。単体テストでは、さまざまなタイムゾーンをシミュレートする必要があります。そのためには、多くの問題があります。C++:googleテストを使用してユニットテストで異なるタイムゾーンをシミュレートする方法

私はすでに他の企業がこの問題を抱えていないため、他の人たちがどのようにして研究しているかについて研究しています:)しかし、私はその解決策を見いだせませんでした。 私の考えは次のようなものです: CTime自体は時刻をUTCで保存し、オンデマンドで現地時間に変換します。私の仮定は、これらすべての関数は、timezonapi.hで宣言されているGetTimeZoneInformation()関数が必要であるということです。

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

だから、解決策は、多分、私はオンデマンドで変更することができますオブジェクトを返しカスタマイズ機能によって、このGetTimeZoneInformation()の機能を交換することです。しかし、私はそれを行う方法がわかりませんし、アプリケーションが起動したときにこの関数を1回しか呼び出すことがないため、これが動作しているかどうかもわかりません。

誰もこのトピックに対処する方法を知っていますか?私は行動を変えたいとは思っていません。時間計算の仕組みを壊すことなく自分のタイムゾーンを設定できるようにしたいだけです。最善のことは、もし私が何とかそれらの呼び出しを模倣することができ、そのための生産コードを変更することであろう。 このプログラムは非常に大きく、古いものです...できるだけ少なく変更することは常に最高です:)

私の問題を解決した既存の投稿が見つからない場合は、本当に申し訳ありませんが、私はそれを見つけられなかったか、または私はこれが私を助けることができなかったからです。

+1

あなたが望むように見えます私たちはあなたのためにいくつかのコードを書いています。多くのユーザーは、苦労しているコーダーのコードを作成したいと考えていますが、通常は、ポスターがすでに問題を解決しようとしているときにのみ役立ちます。この努力を実証する良い方法は、これまでに書いたコード、サンプル入力(もしあれば)、予想される出力、実際に得られる出力(コンソール出力、トレースバックなど)を含めることです。あなたが提供する詳細があれば、受け取る可能性の高い回答が増えます。 [FAQ]と[ask]を確認してください。 –

答えて

0

あなたの質問に言及したように、この問題を解決するには、模擬が良い方法です。

と私が知っている最も簡単な方法は、あなたが「戦略」デザインパターンを実装する新しいクラスでテストしたいすべてのメソッドをラップすることにより、次のとおりです。

これは、実際の実装とモックを切り替えることができ、一度ロジックをモックに設定するとモック値が返されます。

デフォルトでは、実際の実装に設定する必要があります。

「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のすべての呼び出しを変更することですシングルトンのデザインパターン。

それは高いリスクを持っていない、とあなたが行う必要があります変更は「にはFoo()」からの呼び出しを変更している「StrategyImplementation ::でGetInstance()。はFoo()」

関連する問題