2016-04-19 11 views
0

Я пишу сценарий, проверяющий исключение таймаута. Это мой рубин код:Как проверить, было ли возбуждено исключение в тесте Gherkin?

# 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

Как отразить тайм-аута :: Ошибка интерфейса вашего приложения? –

+1

Из любопытства вы используете тестовый инструмент/упряжь, например 'minitest' или' rspec' вместе с ruby ​​и 'cucumber'? – orde

+0

orde, я бегу его с огурцом! – Dennis

ответ

1

Охотник - это не место, где происходит волшебство. Магия происходит в файлах определения шага, где вы используете Ruby, selenium, RSpec и другие технологии (например, Capybara) для создания желаемого поведения. Поэтому, чтобы перефразировать ваш вопрос: «Как я могу проверить исключение тайм-аута, учитывая реализацию огурца, рубина, RSpec и селена?»

Selenium имеет концепцию неявных ожиданий. То есть, продолжительность, в течение которой селен повторяет операцию до объявления отказа. Вы можете контролировать неявные ожидания, установив следующее в вашем 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/исключения, т.е. RSpec 3.

0

Во-первых, вы должны быть в состоянии выполнить код, который необходимо протестировать таким образом, что тайм-аут будет гарантирован. Это один из способов вызвать cli и настроить файлы конфигурации и еще что-то, но вам было бы намного лучше, если бы вы могли напрямую обращаться к соответствующей части кода с вашего определения шага.

Затем вы хотите проверить результаты шагов «Когда» на шагах «Затем». Вы включаете фактический вызов на этапе «Когда» в блоке «try» и сохраняете результат, а также любое исключение где-нибудь, где шаг «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") 
Смежные вопросы