5

私のコマンドライン Ruby プログラムの一部には、コマンドが処理される前にインターネット接続があるかどうかのチェックが含まれます。プログラムでの実際のチェックは (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

You can stub your has_internet? method and return false in the implementation of the Given the Internet is down step.

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

多分あなたには少し遅れます:)、しかし見てください

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

ネットワーク障害をテストするためにこれを作成したので、これでうまくいくはずです。

于 2015-03-20T10:49:15.590 に答える
0

There are three alternative solutions I can think of:

  1. have the test temporarily monkeypatch TCPSocket.initialize (or maybe Socket#connect, if that's where it ends up) to pretend the internet is down.
  2. write (suid) a script that adds/removes an iptables firewall rule to disable the internet, and have your test call the script
  3. C 呼び出しLD_PRELOADをオーバーライドする、特別に作成された .so 共有ライブラリで使用します。connectこれは難しいです。

私自身、おそらくオプション 1 を試して、約 5 分後にあきらめて、オプション 2 に進みます。

于 2012-05-01T19:04:34.320 に答える