2016-12-15 12 views
0

1つのファイルで複数のOSユニットテスト - 可能ですか?私はこのような何か実行する必要があり

void Test::testUnitTest() { 
#define OS_MACOSX 1 
    performUnitTest(); 
#undef OS_MACOSX 
    performUnitTest(); 
} 

void Test::performUnitTest() { 
    CefKeyEvent event; 
    event.modifiers = CTRL; 
    event.windows_key_code = KeyboardHander::KeyCodeC; 
#ifdef OS_MACOSX 
    fructose_assert(1==2); 
    event.modifiers = COMMAND; 
#endif 
    fructose_assert(handler.get()->IsCopyRequest(event)); 
} 

を...

bool RealClass::IsCopyRequest(const CefKeyEvent& event) { 
#ifdef OS_MACOSX 
    return IsCOMMANDDown(event.modifiers) && event.character == 'c'; 
#else 
    return isCTRLDown(event.modifiers) && event.character == 'c'; 
#endif 
} 

testUnitTest()が呼び出されると、performUnitTest()でfructose_assert(1 == 2)が呼び出されることはありません。実際のテストでは、常にisCTRLDown()メソッドが呼び出されます。プリプロセッサディレクティブには意味があります。問題は、これを実際に動作させるにはどうすればいいですか?

+0

実際のコードでは、performUnitTest()は、ロジックに '#ifdef OS_MACOSX'を使用するクラスのメソッドを呼び出します_あなたの_real_にもっと近いサンプルを提供してください。 –

+0

スクリプトをビルドする場合は、コンパイルするプラットフォームに応じてマクロを定義します。したがって、 'OS_MACOSX'はbuildscriptによって定義されるべきです。そしてあなたのコード(単体テストを含む)でこのマクロが設定されているかどうかをテストします。 '#ifdef OS_MACOSX' –

答えて

0

プリプロセッサマクロ#defineはプリプロセッサマクロです。これは、コンパイラが呼び出される前に処理されることを意味します。プリプロセッサはファイルを処理し、コンパイラに送信します。

私は、あなたは、コンパイラは何も受信しない

#define OS_MACOSX 1 
    #ifdef OS_MACOSX 
      performUnitTest(); 
    #endif 
#undef OS_MACOSX 

を書きます。

しかし、あなたはOS_MACOSXセットでメソッドを呼び出しますが、単に大まか特別何もしませんしません

#define OS_MACOSX 1 
    performUnitTest(); 
#undef OS_MACOSX 

を行うときに、コンパイラは(performUnitTestを受けます)。

performUnitTestがマクロそのものだった場合はうまくいくでしょうが、それはおそらく悪い考えです。

gccを使用している場合は、-save-tempsオプションを使用して、.iファイルを参照してください。これはプリプロセッサの出力です。

は、次のようなテスト関数にパラメータを渡すことができます。

void Test::testUnitTest() { 
    performUnitTest(true); 
    performUnitTest(false); 
} 

void Test::performUnitTest(bool is_mac_os) { 
    CefKeyEvent event; 
    event.modifiers = CTRL; 
    event.windows_key_code = KeyboardHander::KeyCodeC; 
    if (is_mac_os) { 
     fructose_assert(1==2); 
     event.modifiers = COMMAND; 
    } 
    fructose_assert(handler.get()->IsCopyRequest(is_mac_os, event)); 
} 

... 

bool RealClass::IsCopyRequest(bool is_mac_os, const CefKeyEvent& event) { 
    if (is_mac_os) { 
     return IsCOMMANDDown(event.modifiers) && event.character == 'c'; 
    } else { 
     return isCTRLDown(event.modifiers) && event.character == 'c'; 
    } 
} 

しかし、私は、これはあなたが望むものである感じることはありません。 あなたのコードがプラットフォームに依存する場合(IsCopyRequestと発音されます)、これは単体テストをMacOSと別のOSで実行することを意味します。 だからあなたは、あなたが(定義されてOS_MACOSXで)MacOSの上でこれをコンパイルして実行し

void Test::testUnitTest() { 
    performUnitTest(); 
} 

void Test::performUnitTest() { 
    CefKeyEvent event; 
    event.modifiers = CTRL; 
    event.windows_key_code = KeyboardHander::KeyCodeC; 
#ifdef OS_MACOSX 
    fructose_assert(1==2); 
    event.modifiers = COMMAND; 
#endif 
    fructose_assert(handler.get()->IsCopyRequest(is_mac_os, event)); 
} 

を書くことができます。 そして、これを別のos(OS_MACOSXを定義せずに)でコンパイルして実行します。

+0

ニコラスに感謝します。私は議論をすることができます。何をお勧めしますか? – user3564870

+0

答えに私の返信を編集しました。 –

関連する問題