gmock SetArgReferee:设置一个不可复制、不可移动对象。

3

我正在使用 gmock 并对一个接受 boost::beast::http::response_parser 作为输出参数的函数进行模拟。函数签名大致如下:

error_code readFromSocket(boost::beast::http::response_parser& resp);

现在,为了测试这个函数,我使用了mock并使用如下的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));

当我尝试使用ByRefByMove,使用std::ref等不同的组合时,它会返回一个operator= deleted compilation编译错误,而且我理解为什么它们不起作用。

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

谢谢。

编辑

这是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.

不,我不是在测试response_parser。我正在测试我编写的用于执行套接字操作的类之一。在那里,我使用response_parser对象从套接字中读取。具体来说,我调用async_read函数。在我的情况下,我发现response_parser比使用beast::http::message类更合适。 - Abhishek Arya
明白了,我会考虑一下如何解耦我的接口。谢谢。 - Abhishek Arya
我需要为我的响应设置body_limit,为此我需要调用resp.body_limit(),但在beast::http::message中没有这个函数。因此,我不能依赖于使用response_parser。你所说的“在组合操作的级别进行测试”是什么意思?你是指在实际套接字写入时进行测试吗?如果是的话,我已经在做了。 - Abhishek Arya
@AbhishekArya 更高级别的测试是检测body_limit功能是否正常工作,而不是检测所设置的特定限制是否被感知到。毕竟,我们不需要单元测试来确保body_limit()按照描述运行。我们需要确保其限制内存和入站流量资源的效果。如果需要感知所设置的限制,请将其作为可测试接口读取将要设置的数字。保持一切简单。 - sehe
@sehe,不,我不想测试 body_limit() 是否正常工作。编辑问题以反映 readFromSocket 的功能。 - Abhishek Arya
显示剩余3条评论
1个回答

0

我试图实现相同的行为,而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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接