我有一个 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 的路由条目的适配器视为“连接到 Internet”怎么样?其他建议?
您明白为什么我在当前测试逻辑中会收到“已连接”错误吗?
最佳答案
我只能回答你关于单元测试的问题。
用您自己的话说,您正在测试的代码是“一个 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/
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。
我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife