在 gtest 中为返回 nlohmann::json 对象的函数编写单元测试
Writing a unit test in gtest for a function returning an nlohmann::json object
这是我要为其创建测试的函数:
static nlohmann::json parse_json(const std::string& file_path)
{
std::ifstream i(file_path);
nlohmann::json j = nlohmann::json::parse(i);
return j;
}
我理解这种类型的测试:
TEST(FactorialTest, HandlesZeroInput) {
EXPECT_EQ(Factorial(0), 1);
}
但是当我的函数返回一个对象时,我不确定如何完成它。这是嘲笑发挥作用的地方吗?
我需要在哪里写这样的东西:
class fakeJsonObject {
public:
MOCK_METHOD(nlohmann::json, parse_json, std::string& file_path);
};
然后用我的模拟对象创建一个测试并将其与从我的 parse_json
函数创建的对象进行比较?
一般答案:好的单元测试遵循 AAA 规则
安排:准备要测试的东西的地方
Act : 正在测试的函数调用
断言:断言函数调用给您正确的结果。
因此,在您的情况下,您必须准备/或更好地生成一个包含 json 数据的文件。 (排列).
调用函数。 (行动)
断言您得到了一个 nlhohmann::json 对象,该对象与文件中包含的 json 数据相关。(断言)
这是我要为其创建测试的函数:
static nlohmann::json parse_json(const std::string& file_path)
{
std::ifstream i(file_path);
nlohmann::json j = nlohmann::json::parse(i);
return j;
}
我理解这种类型的测试:
TEST(FactorialTest, HandlesZeroInput) {
EXPECT_EQ(Factorial(0), 1);
}
但是当我的函数返回一个对象时,我不确定如何完成它。这是嘲笑发挥作用的地方吗? 我需要在哪里写这样的东西:
class fakeJsonObject {
public:
MOCK_METHOD(nlohmann::json, parse_json, std::string& file_path);
};
然后用我的模拟对象创建一个测试并将其与从我的 parse_json
函数创建的对象进行比较?
一般答案:好的单元测试遵循 AAA 规则
安排:准备要测试的东西的地方
Act : 正在测试的函数调用
断言:断言函数调用给您正确的结果。
因此,在您的情况下,您必须准备/或更好地生成一个包含 json 数据的文件。 (排列).
调用函数。 (行动)
断言您得到了一个 nlhohmann::json 对象,该对象与文件中包含的 json 数据相关。(断言)