c++ - gmock SetArgReferee:设置一个不可复制不可移动的对象
问题描述
我正在使用 gmock 并模拟了一个将 boost::beast::http::response_parser作为输出参数的函数。函数签名看起来像:
error_code readFromSocket(boost::beast::http::response_parser& resp);
现在,为了测试这个功能,我模拟并使用EXPECT_CALL
如下:
boost::beast::http::response_parser respObject;
// set status code in respObject
EXPECT_CALL(mockObject, readFromSocket(_))
.Times(1)
.DoAll(SetArgReferee<0>(respObject), Return(err::success));
它给我一个operator= deleted compilation
错误。我尝试了各种使用ByRef
, ByMove
, usingstd::ref
的组合,但它们都不起作用,我理解它们为什么不起作用。
有没有人遇到过类似的情况并且知道如何解决这个错误?如果您需要澄清,请告诉我。
谢谢你。
编辑
这readFromSocket
看起来像:
template<typename T>
error_code readFromSocket(beast::http::response_parser<T>& resp,
boost::asio::yield_context yield)
{
// read from socket using beast::http::async_read
return success;
}
我就是这样称呼它的。
beast::http::response_parser<beast::http::string_body> resp;
resp.body_limit((std::numeric_limits<std::string::size_type>::max)());
auto ec = readFromSocket(resp, yield);
// after this I do error handling and response status code handling.
解决方案
我试图实现相同的行为并且WithArg
是关键。这是我最终得到的一个例子:
#include <gmock/gmock.h>
#include <gtest/gtest.h>
using namespace testing;
struct NonCopyable {
NonCopyable() = default;
NonCopyable(const NonCopyable&) = delete;
NonCopyable& operator=(const NonCopyable&) = delete;
int a;
};
struct WorkWithNonCopyable {
virtual ~WorkWithNonCopyable() = default;
virtual bool modify_non_copyable(NonCopyable& nc) = 0;
};
struct WorkWithNonCopyableMock {
MOCK_METHOD1(modify_non_copyable, bool(NonCopyable& nc));
};
TEST(WorkWithNonCopyableTest, NormalizedRoiDetectorTest) {
WorkWithNonCopyableMock work_with_non_copyable_mock{};
EXPECT_CALL(work_with_non_copyable_mock, modify_non_copyable(_))
.WillOnce(DoAll(WithArg<0>([](auto& arg) { arg.a = 42; }), Return(true)));
NonCopyable non_copyable;
ASSERT_TRUE(work_with_non_copyable_mock.modify_non_copyable(non_copyable));
ASSERT_EQ(non_copyable.a, 42);
}
推荐阅读
- api - 在没有交互用户的情况下,OAuth 如何在 API 到 API 的情况下工作?
- javascript - 使用 Hook 将 React 类组件转换为函数组件
- python - 如何确定鼠标是否悬停/单击 pygame 精灵(不是矩形或圆形)
- reactjs - 如果在我的 MERN 应用程序中删除另一张照片后单击一张照片,我会收到“this.props.comments.map is not a function”或其他错误
- android - Android Studio - 两个 Windows 的问题
- django - Docker:我如何使用从前端访问另一个容器中的服务?
- python - sqlalchemy.exc.NoReferencedTableError:外键找不到表
- html - react-bootstrap-sweetalert 警报没有出现在屏幕中央
- typescript - 打字稿:根据枚举值制作类型
- apache-spark-mllib - 如何使用坐标获取火花millib矩阵的元素