10

我正在尝试在模拟上设置一个“out”参数SetArgPointee。这是我正在测试的代码:

DWORD bodysize = 1024;
char body[1024];
HRESULT hr = req->ReadEntityBody(body, bodysize, false, &bodysize, NULL);

req是一个IHttpRequest*,我想bodysize在模拟中设置参数 3。这是我的单元测试中的代码:

EXPECT_CALL(req, ReadEntityBody(NotNull(), Ge(1024), false, NotNull(), _))
    .WillOnce(SetArgPointee<3>(4))
    .WillOnce(Return(ERROR_HANDLE_EOF));

这会导致以下奇怪的错误:

错误 C2440:'return':无法从 'void' 转换为 'long' (gmock/gmock-actions.h:369)

如果我注释掉.WillOnce(SetArgPointee<3>(4)),代码编译并正确执行。这是模拟本身的相关定义:

MOCK_METHOD5(ReadEntityBody, HRESULT(VOID *pvBuffer, DWORD cbBuffer, BOOL fAsync, DWORD *pcbBytesReceived, BOOL *pfCompletionPending));

而且,如果它有帮助,我对 IHttpRequest 的完整模拟

4

1 回答 1

15

您的操作没有正确组合。因此,您的EXPECT_CALL声明缺少 a Return,这就是为什么您在尝试转换为时收到错误消息的void原因long。确保您使用的是DoAll()

EXPECT_CALL(req, ReadEntityBody(NotNull(), Ge(1024), false, NotNull(), _))
    .WillOnce(DoAll(SetArgPointee<3>(4), Return(ERROR_HANDLE_EOF)));
于 2013-08-21T21:09:40.417 回答