2016-12-15 51 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

我编辑了我的答案来回答,我希望这是有道理的。 –

相关问题