ODF/tests/test_list_racks.cpp

89 lines
2.2 KiB
C++

#include <gtest/gtest.h>
#include <gmock/gmock.h>
#include <vector>
#include <string>
#include <stdexcept>
// 假设的数据结构
struct RackListResponse {
std::string rack_id;
std::string rack_name;
int unit_count;
};
// 服务接口
class Service {
public:
virtual ~Service() = default;
virtual std::vector<RackListResponse> list_racks() = 0;
};
// 全局服务指针(模拟原 Python 代码中的 service 模块)
Service* g_service = nullptr;
// 被测函数:对应原 Python 中的 list_racks()
std::vector<RackListResponse> list_racks() {
return g_service->list_racks();
}
// Mock 服务类
class MockService : public Service {
public:
MOCK_METHOD(std::vector<RackListResponse>, list_racks, (), (override));
};
// 测试夹具
class ListRacksTest : public ::testing::Test {
protected:
void SetUp() override {
mock_service = new MockService();
g_service = mock_service;
}
void TearDown() override {
delete mock_service;
g_service = nullptr;
}
MockService* mock_service;
};
// 正常输入测试:返回非空机架列表
TEST_F(ListRacksTest, testListRacksNormal) {
std::vector<RackListResponse> expected = {
{"rack-1", "机架A", 5},
{"rack-2", "机架B", 3}
};
EXPECT_CALL(*mock_service, list_racks())
.WillOnce(::testing::Return(expected));
auto result = list_racks();
ASSERT_EQ(result.size(), 2);
EXPECT_EQ(result[0].rack_id, "rack-1");
EXPECT_EQ(result[0].rack_name, "机架A");
EXPECT_EQ(result[0].unit_count, 5);
EXPECT_EQ(result[1].rack_id, "rack-2");
EXPECT_EQ(result[1].rack_name, "机架B");
EXPECT_EQ(result[1].unit_count, 3);
}
// 边界值测试:返回空列表
TEST_F(ListRacksTest, testListRacksEmpty) {
std::vector<RackListResponse> empty;
EXPECT_CALL(*mock_service, list_racks())
.WillOnce(::testing::Return(empty));
auto result = list_racks();
EXPECT_TRUE(result.empty());
}
// 异常输入测试:服务抛出异常
TEST_F(ListRacksTest, testListRacksServiceThrows) {
EXPECT_CALL(*mock_service, list_racks())
.WillOnce(::testing::Throw(std::runtime_error("database error")));
EXPECT_THROW(list_racks(), std::runtime_error);
}