2016-04-19 11 views
0

タイムアウトの例外をチェックするシナリオを作成しています。これは私のRubyコードです:ガーキンテストで例外が発生したかどうかを確認するにはどうすればよいですか?

# Execute the constructed command, logging out each line 
    log.info "Executing '#{command.join(' ')}'" 
    begin 
     timeout(config['deploy-timeout'].to_i) do 
      execute_and_log command 
     end 
    rescue Exception => e 
     log.info 'Err, timeout, ouch' 
     raise Timeout::Error 
    end 

私はのErr、タイムアウトまたは例外がガーキン/キュウリで育ったかのための出力のいずれかをチェックしたいと思います。

Then(/^the output should be 'Err, timeout, ouch'$/) do 
    puts 'Err, timeout, ouch' 
end 

どうすればいいですか?

+0

はどのようにタイムアウト::エラーは、アプリケーションのUIを反映していますか? –

+1

ルビーとキュウリと一緒に 'minitest'や' rspec'のようなテストツール/ハーネスを使っていますか? – orde

+0

orde、私はキュウリでそれを実行しています! – Dennis

答えて

1

ガーキンは魔法が発生する場所ではありません。この魔法は、Ruby、Selenium、RSpecなどの技術(例:Capybara)を使用して目的の動作を作成するステップ定義ファイルで行われます。あなたの質問を言い換えると、「キュウリ、ルビー、RSpec、セレンの実装でタイムアウトの例外をテストするにはどうしたらいいですか?

セレンには暗黙の待ちの概念があります。つまり、セレンが失敗を宣言する前に操作を再試行する期間です。 env.rbで次のように設定して、暗黙の待機を制御できます。

# Set the amount of time the driver should wait when searching for elements 
driver.manage.timeouts.implicit_wait = 20 

# Sets the amount of time to wait for an asynchronous script to finish 
# execution before throwing an error. If the timeout is negative, then the 
# script will be allowed to run indefinitely. 
driver.manage.timeouts.script_timeout = 20 

# Sets the amount of time to wait for a page load to complete before throwing an error. 
# If the timeout is negative, page loads can be indefinite. 
driver.manage.timeouts.page_load = 20 

単位は秒です。 implicit_waitを 'Err、timeout、ouch'タイムアウトよりも高く設定する必要があります。思う。

私は、WebDriverが待ち時間を超えたときにエラー:: TimeOutErrorをスローすると信じています。あなたのコードは何を投げますか?タイムアウト::エラー?だから、救助のセクションで:

Given(/^ .... $/ do 
    ... 
    rescue Error::TimeOutError => e 
    @timeout_exception = "Error::TimeOutError" 
    end 
    rescue Timeout::Error => f 
    @timeout_exception = "Err, timeout, ouch" 
    end 
end 

Then(/^the output should be 'Err, timeout, ouch'$/) do |expectedException| 
    expect(@timeout_exception).to eq(expectedException), "Err, timeout, ouch" 
end 

上記あなたはすなわちRSpecの3

0

まず、あなたは、このような方法でテストを必要とするコードを実行できるようにする必要があり、RSpecの/例外を使用していることを前提としていタイムアウトが保証されること。これは、cliを呼び出して設定ファイルとそれ以外のものを設定するオプションですが、コードの関連する部分だけを直接呼び出してステップ定義から直接呼び出せれば、はるかに良いでしょう。

次に、[Then]ステップの[When]ステップの結果をテストしたいと考えています。実際の呼び出しを '試行'ブロックの 'When'ステップで囲み、 'Then'ステップがアサーションを実行できるどこかの例外と同様に結果を格納します。

線に沿って何か(構文を言い訳してください):

Given(/a configuration that will cause a timeout/) do 
    sharedContext.config = createConfigThatWillCauseTimeout() 

When(/a command is executed/) do 
    begin: 
    sharedContext.result = executeCommand(sharedContext.config) 
    rescue Exception => ex 
    sharedContext.exception = ex 

Then(/there should have been a Timeout/) do 
    logContent = loadLogContent(sharedContext.config) 
    assert sharedContext.exception.is_a?(Timeout::Error) 
    assert logContent.contains("Err, timeout, ouch") 
関連する問題