我需要做这样的事情:
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 :(得分: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
)并运行它。