首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >gmock SetArgReferee:设置不可复制、不可移动的对象

gmock SetArgReferee:设置不可复制、不可移动的对象
EN

Stack Overflow用户
提问于 2020-07-28 03:09:50
回答 1查看 267关注 0票数 2

我正在使用gmock,并模拟了一个将boost::beast::http::response_parser作为输出参数的函数。函数签名类似于:

代码语言:javascript
运行
复制
error_code readFromSocket(boost::beast::http::response_parser& resp);

现在,为了测试这个函数,我模拟并使用了EXPECT_CALL,如下所示:

代码语言:javascript
运行
复制
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错误。我尝试了使用ByRefByMovestd::ref的各种组合,但它们都不起作用,我理解为什么它们不起作用。

以前有没有人遇到过类似的情况,并且知道如何解决这个错误?如果你需要澄清,请告诉我。

谢谢。

编辑

这是readFromSocket的样子:

代码语言:javascript
运行
复制
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;
}

这是我的叫法。

代码语言:javascript
运行
复制
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.
EN

回答 1

Stack Overflow用户

发布于 2021-04-07 16:05:32

我试图实现同样的行为,而WithArg是关键。这是我最终得到的一个例子:

代码语言:javascript
运行
复制
#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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63121963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档