Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to force a cucumber scenario to fail?

Is there a way to force a cucumber scenario to fail?

I need to check for a few failing scenarios at the end of each of my tests. So I thought I could do the check for an 'error' dialog and then fail the test if it occurred.

This is possible with the code below however there is a problem. Once I raise the exception in the fail! function, then cucumber stops running the rest of the After hook, so the logout function doesnt get called.

Was:

After() do |scenario|  
  #Checking for Error popups
  if page.has_selector?(:dialog_message, 1, :text => 'Error')
    fail!(raise(ArgumentError.new('Unexpected Error dialog!')))
  end
  logout
end

Now:

After() do |scenario|  
  #Checking for Error popups
  if page.has_selector?(:dialog_message, 1, :text => 'Error')
    scenario.fail!(logout)
  end
end

Is there a better way to fail a cucumber test without raising an exception?

like image 749
snowstreams Avatar asked Aug 03 '12 13:08

snowstreams


2 Answers

You can get the after hook to fail using your normal assertions. Have not done much with Capybara/rspec exceptions, but I think you can do:

page.should have_selector?(:dialog_message, 1, :text => 'Error')

However, if you do this or do the scenario.fail!(), you will still not logout. You need to wrap it in a begin-ensure block.

Try this:

After do |scenario|
    begin
        page.should have_selector?(:dialog_message, 1, :text => 'Error')
    ensure
        logout
    end
end

Update

If you do not want to call the standard assertions and directly fail the scenario, you can do the following - you need to use fail instead of fail!:

After() do |scenario|  
  begin 
    #Checking for Error popups
    if page.has_selector?(:dialog_message, 1, :text => 'Error')
      fail(ArgumentError.new('Unexpected Error dialog!'))
      #Or you can just do fail('Unexpected Error dialog') if you do not care about the type.
    end
  ensure
    logout
  end
end
like image 152
Justin Ko Avatar answered Oct 15 '22 15:10

Justin Ko


Just a preliminary answer as I haven't been able to check it out yet, but I'd assume that calling Raise is always guaranteed to halt execution (unless it's done inside a proc or lambda so it's evaluation is deferred).

Try simply

if page.has_selector?(:dialog_message, 1, :text => 'Error')
    scenario.fail!(StandardError.new('Unexpected Error Dialog!'))
end
logout
like image 22
Jon M Avatar answered Oct 15 '22 15:10

Jon M