Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ I';我试图从gmock类返回一个rapidjson::值,但我可以';我好像没法让它发挥作用_C++_Googletest_Googlemock_Rapidjson - Fatal编程技术网

C++ I';我试图从gmock类返回一个rapidjson::值,但我可以';我好像没法让它发挥作用

C++ I';我试图从gmock类返回一个rapidjson::值,但我可以';我好像没法让它发挥作用,c++,googletest,googlemock,rapidjson,C++,Googletest,Googlemock,Rapidjson,我正试图对我的一个类进行单元测试,但我很难从模拟类返回rapidjson::值 我环顾了一下互联网,到目前为止还没有成功。这是我最后一次尝试 我运行的代码如下: class json_action_audit_generator_tests : public ::testing::Test { std::string test_focus_array = "[[11,12],[21,22],[31,32],[41,42],[51,52],[61,62],[71,72],[81,82],

我正试图对我的一个类进行单元测试,但我很难从模拟类返回rapidjson::值

我环顾了一下互联网,到目前为止还没有成功。这是我最后一次尝试

我运行的代码如下:

class json_action_audit_generator_tests : public ::testing::Test 
{
    std::string test_focus_array = "[[11,12],[21,22],[31,32],[41,42],[51,52],[61,62],[71,72],[81,82],[91,92],[101,102],[111,112],[121,122],[131,132]]";

    Value create_json_key_from_enum(storage_enum mapped_value, rapidjson::Document& root)
    {
        return Value(storage_from_enum[mapped_value].c_str(), root.GetAllocator());
    }
}

TEST_F(json_action_audit_generator_tests, TestAddJsonFocusInformation)
{
    std::stringstream ss;
    ss << "{\"" << storage_from_enum[storage_enum::JsonFocus] << "\":"
        << "["
            << "[" << "11,12" << "]" << ","
            << "[" << "21,22" << "]" << ","
            << "[" << "31,32" << "]" << ","
            << "[" << "41,42" << "]" << ","
            << "[" << "51,52" << "]" << ","
            << "[" << "61,62" << "]" << ","
            << "[" << "71,72" << "]" << ","
            << "[" << "81,82" << "]" << ","
            << "[" << "91,92" << "]" << ","
            << "[" << "101,102" << "]" << ","
            << "[" << "111,112" << "]" << ","
            << "[" << "121,122" << "]" << ","
            << "[" << "131,132" << "]"
        << "]"
    << "}";

    rapidjson::Document root;
    root.SetObject();

    Value json_focus_information(rapidjson::kObjectType);
    add_json_string_member(root, root, create_json_key_from_enum(storage_enum::JsonFocus, root), test_focus_array.c_str());


    json_action_audit_generator testee(dashboard_action.get(), EKS.get(), json_focus_serializer.get());
----------
    EXPECT_CALL(*json_focus_serializer, get_focus_as_json_value()).WillOnce(Return(&json_focus_information));
----------

    testee.add_json_focus_information();
    EXPECT_EQ(ss.str(), testee.create_json_string());
};

问题是在
EXPECT\u调用中
尝试从声明为返回
rapidjson::Value
的函数返回
rapidjson::Value*

如果
rapidjson::Value
有一个正确的复制构造函数,那么您需要做的就是使用
WillOnce(Return(json\u focus\u information))
(注意缺少的符号和)

然而,由于rapidjson不允许您在不指定分配器的情况下创建
rapidjson::Value
的副本,所以事情就不那么容易了。 我知道从模拟中返回
json\u focus\u信息副本的一种方法是使用
::testing::Invoke
操作,而不是像这样使用
::testing::return

auto return_json_focus_information = [&]() -> rapidjson::Value {
  static auto allocator = rapidjson::MemoryPoolAllocator{};
  return rapidjson::Value{json_focus_information, allocator};
}

EXPECT_CALL(*json_focus_serializer, get_focus_as_json_value())
    .WillOnce(::testing::Invoke(return_json_focus_information));
但是请注意,与
testing::Return
相反,副本将在调用
get\u focus\u时创建,而不是在设置期望时创建

但是,如果在测试中您甚至不需要
json\u focus\u信息
变量,那么您也可以使用它

auto return_json_focus_information = []() -> rapidjson::Value {
  return rapidjson::Value{rapidjson::kObjectType};
}

EXPECT_CALL(*json_focus_serializer, get_focus_as_json_value())
   .WillOnce(::testing::Invoke(return_json_focus_information));

并且完全去掉原始的
json\u focus\u信息
变量。

与您的问题无关,但是为什么要这样做呢,例如
当然。我可以在以后更新字符串。我现在只想把它编译出来!另外,感谢您提供的样式提示。您正试图调用一个不允许触摸的
GenericValue
构造函数。我们无法从这个错误判断问题出是复制构造函数、移动构造函数还是默认构造函数。知道
gmock actions.h
中的哪一行已经很有帮助了(我很确定这个错误还将您链接到
GenericValue
定义中的正确位置,这样我们就可以找到它试图使用的构造函数)。您能详细说明一下您的意图吗?你想用这段代码实现什么?@MaxLanghof-目前正在gmock actions.h的第562行调用它。这最终到达gmock internal utils.h中的第496行。这看起来像是通过一组论点来构建的。太棒了!这是可行的,答案非常棒!我完全理解为什么它以前不工作!先生/女士,你是蜜蜂的膝盖!
#pragma once
#include "document.h"
#include <string>

class json_focus_serializer_interface {
public:
    json_focus_serializer_interface() = default;
    virtual ~json_focus_serializer_interface() = default;
    virtual rapidjson::Value get_focus_as_json_value() = 0;
    virtual std::string get_focus_as_json_string() = 0;
};
#pragma once
#include "json_focus_serializer_interface.h"
#include "gmock/gmock.h"


class mock_json_focus_serializer_interface : public json_focus_serializer_interface {
public:

    mock_json_focus_serializer_interface() = default;
    ~mock_json_focus_serializer_interface() = default;

    MOCK_METHOD(rapidjson::Value, get_focus_as_json_value, (), (override));
    MOCK_METHOD(std::string, get_focus_as_json_string, (), (override));
};
auto return_json_focus_information = [&]() -> rapidjson::Value {
  static auto allocator = rapidjson::MemoryPoolAllocator{};
  return rapidjson::Value{json_focus_information, allocator};
}

EXPECT_CALL(*json_focus_serializer, get_focus_as_json_value())
    .WillOnce(::testing::Invoke(return_json_focus_information));
auto return_json_focus_information = []() -> rapidjson::Value {
  return rapidjson::Value{rapidjson::kObjectType};
}

EXPECT_CALL(*json_focus_serializer, get_focus_as_json_value())
   .WillOnce(::testing::Invoke(return_json_focus_information));