5

我的命令行 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!"

我显然不想更改实现以适应测试,并且我要求所有场景都通过。显然,如果实际上没有连接,则测试按原样通过,但我的其他测试失败,因为它们需要连接。

我的问题:我怎样才能以有效的方式对此进行测试并让我的所有测试都通过?

4

3 回答 3

4

您可以存根您的has_internet?方法并在步骤的实现中返回 false Given the Internet is down

YourClass.stub!(:has_internet?).and_return(false)
于 2012-05-01T19:01:06.070 回答
0

我能想到三种替代解决方案:

  1. 让测试暂时进行monkeypatch TCPSocket.initialize(或者 Socket#connect如果它结束了)以假装互联网已关闭。
  2. 编写(suid)一个脚本,添加/删除iptables防火墙规则以禁用互​​联网,并让您的测试调用该脚本
  3. 在覆盖C 调用LD_PRELOAD的特殊编写的 .so 共享库上使用。connect这更难。

我自己,我可能会尝试选项 1,大约 5 分钟后放弃并选择选项 2。

于 2012-05-01T19:04:34.320 回答
0

对你来说可能有点晚了:),但看看

https://github.com/mmolhoek/vcr-uri-catcher

我这样做是为了测试网络故障,所以这应该对你有用。

于 2015-03-20T10:49:15.590 回答