2012-05-01 8 views
3

私のコマンドライン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

has_internet?メソッドをスタブして、Given the Internet is downステップの実装でfalseを返すことができます。

YourClass.stub!(:has_internet?).and_return(false) 
+0

これは、テストがメソッドをスタブしようとしたが、(コマンドラインスクリプト内で)まだ作成されていないため、機能しませんでした。私が実行時に 'Before'フックで常にfalseを返すように関数を編集し、' After'フックでそれを元に戻すような積極的なスタブです。 – xiy

0

私は考えることができる3つの代替の解決策があります(それが終わるところだ場合、または多分Socket#connect

  1. は、テストが一時的にTCPSocket.initializeをモンキーパッチ持ってインターネットをふりをするがダウンしています。追加
  2. 書き込み(SUID)スクリプトは、/インターネットを無効にし、あなたのテストはconnect C呼び出しを上書きし、特別に書かれたの.so共有ライブラリを使用LD_PRELOAD
  3. スクリプトを呼び出す持ってiptablesファイアウォールルールを削除します。これはより困難です。

私自身、私はおそらくあなたが:)が、

https://github.com/mmolhoek/vcr-uri-catcherを見ているため、オプション1を試し、約5分後にあきらめ、多分少し遅れオプションで2

+0

興味深い答えですが、おそらく少し残酷です.1番のテストフックで実行時に関数を「スタブ」するというアイディアを得ましたが、あなたの提案に感謝します! – xiy

0

を行くだろう

私はこれをネットワーク障害をテストするために作ったので、これはあなたのためのトリックを行う必要があります。

関連する問題