how to force a cucumber scenario to fail?

15,901

Solution 1

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

Solution 2

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
Share:
15,901
snowstreams
Author by

snowstreams

I like to dabble with Android widgets in my spare time.

Updated on June 20, 2022

Comments

  • snowstreams
    snowstreams almost 2 years

    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?