Капибара / Рубин - Попытка вернуться к началу цикла, когда появляется ошибка - PullRequest
0 голосов
/ 03 апреля 2019

Я пытаюсь вернуться к началу цикла, когда в коде ниже отображается ошибка.

Я использую команду «next», когда происходит случайная ошибка, но она не возвращается для начала цикла.

describe 'Test', :test do

before(:each) do
    visit '/admin'
end


it 'Adding new images' do

    image = 'barcelona.jpg'

    @imagem = Dir.pwd + '/spec/fixtures/' + image

    produto = '1'

    100.times do

        visit '/admin/' + produto

        if page.has_no_css?('#mensagem > h1')

                within_frame(:xpath, "//*[@id='app-content']/main/div/iframe") do

                    find('#ctl00_Conteudo_tbxNome_txtId').set 'test_name'
                    find('#ctl00_Conteudo_BtnSalvar').click

                    if page.has_no_css?('#mensagem > h1')

                        find('#ctl00_Conteudo_tbxIdArquivoControle_lnkInserirArquivo').click

                        attach_file('ctl00_Conteudo_tbxIdArquivoControle_tbxArquivo', @imagem) 
                        find('#ctl00_Conteudo_tbxIdArquivoControle_btnEnviar').click

                        if page.has_no_css?('#mensagem > h1')

                            find('#skuTabNavigation a[href="#tabImages"]').click
                            expect(page).to have_content image

                            puts 'Test ok'

                        else
                            puts 'Error was presented, starting over..'
                            next
                        end

                    else
                        puts 'Error was presented, starting over..'
                        next
                    end
                end
        else
            puts 'Error was presented, starting over..'
            next
        end
    end
end
end

Мне бы хотелось, чтобы каждый раз, когда система переходила в «другое» состояние, она перезапускала цикл.

1 Ответ

0 голосов
/ 03 апреля 2019

Я не думаю, что есть прямой способ вернуться к начальной итерации цикла. redo существует, но он только возвращает вас к текущей итерации.

В этом случае вы, вероятно, захотите изменить способ зацикливания, чтобы вам было легче контролировать, когда начинать / останавливать. Например:

i = 0

while i <= 100 do
  if page.has_no_css?('#mensagem > h1')
    i = 0
    puts 'Error'
    next
  end

  i += 1
end

Так что вам не нужно сбрасывать индекс цикла и вызывать puts каждый раз, когда вы можете спасти ошибку:

class MyError < StandardError; end
i = 0

while i <= 100 do
  begin
    if page.has_no_css?('#mensagem > h1')
      raise MyError, 'thing was missing'
    end

    puts i
    i += 1
  rescue MyError => boom
    puts "Error: #{boom.message}"
    i = 0
    redo
  end
end
...