gpt4 book ai didi

c++ - 使用 gmock 将值设置为 void** 参数的通用自定义操作

转载 作者:搜寻专家 更新时间:2023-10-31 01:37:30 25 4
gpt4 key购买 nike

我一直在使用 gmock 测试驱动一些使用 COM 接口(interface)的代码。 Win32 函数通过 void ** 使用 COM 返回接口(interface)指针争论。 mock 的时候例如,调用 QueryInterface将返回指向 IPersistFile 的指针的函数界面,我执行以下操作

CPersistFileMock mockIPersistFile;
EXPECT_CALL(mockIShellLink, QueryInterface(_, _)).WillOnce(DoAll(
SetArg1ToIPersistFile(&mockIPersistFile), Return(S_OK)));

其中 SetArg1ToIPersistFile 是这样定义的自定义操作:

ACTION_P(SetArg1ToIPersistFile, pIPersistFile) {
*reinterpret_cast<CPersistFileMock**>(arg1) = pIPersistFile;
}

这行得通,但问题是您必须为每个组合编写一个新的自定义操作参数索引和需要通过 void ** 返回的类型争论。有没有办法概括此自定义操作,以便无论类型和参数索引如何都可以应用它(到类似 SetArgPointee<> 的东西但也知道类型)。

最佳答案

这个问题一直困扰着我们的团队,我们知道我们可以利用 args 的事实是一个使用 std::get<> 的元组在上面,但我们不知道如何以通用方式传递参数索引和类型。最后,我的一位同事想出了如何制作 Action 模板。这是最终的实现:

ACTION_TEMPLATE(SetArgVoidPtrPtr, HAS_2_TEMPLATE_PARAMS(typename, Type, unsigned, uIndex), AND_1_VALUE_PARAMS(value))
{
*reinterpret_cast<Type**>(std::get<uIndex>(args)) = value;
}

及其在 IFilePersist 上下文中的使用方式上面提到的例子:

EXPECT_CALL(mockIShellLink, QueryInterface(_, _)).WillOnce(DoAll(
SetArgVoidPtrPtr<CPersistFileMock, 1>(&mockIPersistFile), Return(S_OK)));

请注意,这种方法可以在一般情况下使用,函数通过 void ** 返回值争论。只是想把它放在那里,因为我没有找到太多关于这个的信息。希望这对遇到类似问题的人有所帮助。

关于c++ - 使用 gmock 将值设置为 void** 参数的通用自定义操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34068883/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com