我有一个 C# 模块,负责获取 Windows Vista 计算机上“连接到互联网”的网络适配器列表。该模块使用“Network List Manager API ”(或 NLM API)迭代所有网络连接,并返回 IsConnectedToInternet 值为 true 的所有网络连接。
我在这个SO question中收到了一些关于该模块实现的建议
为了测试这个模块,我决定编写一个助手,它根据另一个逻辑返回互联网连接接口(interface)的列表,因此这将是对原始模块逻辑的一种“现实检查”。请注意,对于测试助手,我愿意使用可能被视为生产代码的不良做法的检测方法(例如,依赖某些可用的互联网资源,如“Google”),以防它关闭、被我们的内部防火墙阻止等。与已部署的产品库相比,修复测试相对容易)。
我选择的替代检测方法是尝试使用 TcpClient 连接到“www.google.com:80”。我的问题:当我连接多个适配器(例如无线和 LAN)时,其中一个适配器的检测方法会失败,并出现错误“在已连接的套接字上发出连接请求”。
我的问题有三个:
您通常会如何测试这样的模块?您是否支持用不同的方式做同样的事情并比较结果的想法,或者这是一种矫枉过正的做法,我应该依赖系统的 API?我的主要问题是很难预先配置系统以便我提前知道预期的结果是什么。
您会建议什么替代逻辑?上述问题中建议的一件事是查看路由表 - 将每个具有目的地为 0.0.0.0 的路由条目的适配器视为“连接到互联网”怎么样?还有其他建议吗?
您明白为什么我在当前测试逻辑中收到“已连接”错误吗?
最佳答案
我只能回答你关于单元测试的问题。
用您自己的话来说,您正在测试的代码是“一个 C# 模块,负责获取 Windows Vista 计算机上‘连接到互联网’的网络适配器列表。该模块使用‘网络列表管理器’ API'(或 NLM API)来迭代所有网络连接并返回 IsConnectedToInternet 值为 true 的所有网络连接。”
如果我正在编写此模块,我将首先使用 NLM API 的接口(interface),将其称为...NLMAPIService。现在,对于真正的代码,创建一个实现 NLMAPIService 并适应真正的 NLM API 的适配器。
为了进行测试,创建一个实现 NLMAPIService 的 FakeNLMAPI 类,并将其所有数据存储在内存中的某个位置、XML 文件或其他位置。您的模块仅调用 NLMAPIService 上的方法,因此您不必根据是否正在测试而更改任何“实际”代码。
因此,在您的测试设置方法中,您可以实例化 FakeNLMAPI 并将其传递给您的模块,并在生产中实例化您的 NLM API 适配器。
我假设您可以实例化和修改表示网络连接的对象。如果没有,您可以遵循相同的模式来伪造实际的网络连接对象。
关于windows - 对检查互联网连接的模块进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/195460/