2016-12-15 52 views
0

我需要做這樣的事情:多個操作系統單元在一個文件中測試 - 可能嗎?

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

_in在真實代碼中,'p​​erformUnitTest()'會調用在其邏輯中也使用'#ifdef OS_MACOSX'的類的方法。請提供一個更接近您的_real code_的示例! –

+0

在您構建腳本中,您將根據編譯它的平臺定義一個宏。所以'OS_MACOSX'應該由buildscript定義。然後在你的代碼中(包括單元測試),你會測試這個宏是否被設置。 '#ifdef OS_MACOSX' –

回答

0

預處理器宏#define是...預處理器宏。這意味着它們在調用編譯器之前被處理。預處理器處理這些文件,然後將它們發送給編譯器。

我你寫

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

編譯器接收什麼。

但是當你做

#define OS_MACOSX 1 
    performUnitTest(); 
#undef OS_MACOSX 

那不叫有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的聲音),這意味着你想要一個單元測試在MacO上運行,而另一個在另一個OS上運行。 所以,你可以寫

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)); 
} 

然後你編譯這個在MacOS(與定義OS_MACOSX)並運行它。 然後你在另一個操作系統上編譯它(沒有定義OS_MACOSX)並運行它。

+0

謝謝Nicolas。我可以通過一個論點。你會建議什麼? – user3564870

+0

我編輯了我的答案來回答,我希望這是有道理的。 –

相關問題