我的命令行Ruby程序的一部分涉及在处理任何命令之前检查是否存在Internet连接。程序中的实际检查是微不足道的(使用Socket :: TCPSocket),但我正在尝试在Cucumber中测试此行为以进行集成测试。
代码:
def self.has_internet?(force = nil)
if !force.nil? then return force
begin
TCPSocket.new('www.yelp.co.uk', 80)
return true
rescue SocketError
return false
end
end
if has_internet? == false
puts("Could not connect to the Internet!")
exit 2
end
功能:
Scenario: Failing to log in due to no Internet connection
Given the Internet is down
When I run `login <email_address> <password>`
Then the exit status should be 2
And the output should contain "Could not connect to the Internet!"
我显然不想更改实现以适应测试,并且我要求所有方案都通过。显然,如果实际上没有连接,则测试按原样通过,但我的其他测试因需要连接而失败。
我的问题:如何以有效的方式对此进行测试并通过所有测试?
答案 0 :(得分:4)
您可以存储has_internet?
方法,并在执行Given the Internet is down
步骤时返回false。
YourClass.stub!(:has_internet?).and_return(false)
答案 1 :(得分:0)
我能想到三种替代解决方案:
TCPSocket.initialize
(或者可能 Socket#connect
,如果它最终结束的话)假装互联网已关闭。iptables
防火墙规则以禁用互联网,并让测试调用脚本LD_PRELOAD
来覆盖connect
C调用。这更难。我自己,我可能会尝试选项1,大约5分钟后放弃,然后选择2。
答案 2 :(得分:0)