c++ - 如何使用 GoogleMock 设置模拟服务器
问题描述
我正在将旧的 C 代码转换为 C++,并在使用 GoogleTest 重写时对其进行测试。我的部分代码使用套接字连接到具有 IPV4 地址的远程主机。我很难理解如何使用 GoogleTest 和 GoogleMock 来测试我的代码的套接字部分。
我的对象在尝试再次连接到主机之前需要等待主机 IP 地址和秒数。有一个名为“conn()”的函数实际上试图连接到主机。这就是我要测试的功能。所以在我的测试中,我想做类似的事情:
TEST(CONNECTION_TEST, Connection)
{
MyObject obj("###.###.###.###", 1);
ASSERT_TRUE(obj.conn());
}
我在这里读到我需要模拟一个服务器,因为测试远程主机并不是真正可取的。我是 GoogleMock 的新手,所以我阅读了官方文档并阅读了GoogleTest 入门、GoogleMock For Dummies、GoogleMock Cheat Sheet和GoogleMock Cookbook。我看了 CodesBay 的教程。我看了几篇关于 SO 的帖子,包括我尝试用 googlemock 模拟一个简单的 C++ 方法有什么问题?,用于对进行标准库调用的 C++ 方法进行单元测试的模式,以及如何对 BSD 套接字进行单元测试。
对于我的模拟服务器,我执行了以下操作。我制作了一个包装 socket.h 的 Socket 类,然后我从中扩展了 MockSocket。在我的测试中,我设置了模拟套接字以接受连接,如下所示:
TEST(CONNECTION_TEST, Connection)
{
// bind to local host?
MyObject obj("0.0.0.0", 1);
// create the host
MockSocket mock_sock;
MockSocket new_sock;
EXPECT_CALL(mock_sock, create()).Times(1);
EXPECT_CALL(mock_sock, bind(_));
EXPECT_CALL(mock_sock, listen());
EXPECT_CALL(mock_sock, accept(_));
mock_sock.create();
mock_sock.bind(123);
mock_sock.listen();
mock_sock.accept(new_sock);
ASSERT_TRUE(obj.conn());
}
正如你所说,我不知道我在做什么。我的测试结果失败了,我认为这是因为我没有正确执行此操作。请,有人可以指导我正确的方向吗?模拟服务器是测试我的对象的正确方法吗?
解决方案
你想测试什么?
你想测试一下 TCP/IP 套接字类(假设有一个),是否真的可以与一些 TCP/IP 服务连接和通信?这更像是一个端到端的测试。您可以使用 Google Test 来执行此操作,但您需要一个正在运行的 TCP/IP 服务才能与之通信。这不是 Google 模拟框架的用途。这类似于您想要测试一个读取文件的类:您需要一个可以读取的文件,而 Google 模拟框架在这里不会帮助您。
您想测试使用您的 TCP/IP 套接字类的其他类是否有效吗?在这里,您可以使用 Google 模拟框架为您的套接字类创建模拟。此模拟将充当您的其他类的套接字类,但不会进行任何 TCP/IP 通信。这样你就可以对你的其他类进行单元测试。
推荐阅读
- ruby-on-rails - 如何创建表单来触发模型方法
- python - Python错误不让程序运行,因为它说未定义局部变量
- php - 选择语句回显行两次
- math - Sympy Line3D 与立方体的交点
- java - 从直接 JMS 转换为 JNDI 时的问题
- javascript - 如何在 javascript 中动态设置或更改对象的属性名称(尤其是在较旧的 javascript 中)
- angular - 如何从查询参数中选中复选框?
- c++ - 用于嵌入式的 STL 智能指针
- python - 跨平台 Pipenv.lock
- python - 使用 TensorFlow C API 的 Python 扩展模块