Hi all… I have just gotten started with Cucumber and excited about it. But am hitting a problem where I have scenarios failing but the output seems almost useless - all it does is tell me which scenarios failed but not where in the scenario it failed. How does one go about figuring out where things are going wrong? Is there a verbose option?
For example on this failing (and very simple) scenario (which I can not remove enough steps to get it to pass):
Feature: Login logout of system
Scenario: Login
When I am on the login page
Then I should see “Lender Login”
When I ‘rake cucumber’ it fails, I have no idea if the problem is syntax, routes, something with capybara, data (well not in this case), or just that my app does not work. I know I can go to a browser and get this page to load so I know it is not the latter.
I am not concerned with this specific example per se but to any hints as to a working strategy to troubleshoot scenarios under Cucumber and be able to move past failures.
Hi all.... I have just gotten started with Cucumber and excited about
it.
But am hitting a problem where I have scenarios failing but the output
seems
almost useless - all it does is tell me which scenarios failed but not
where
in the scenario it failed. How does one go about figuring out where
things
are going wrong? Is there a verbose option?
You know, if you're going to complain about the output, the least you
could do is show us the output you're getting...
For example on this failing (and very simple) scenario (which I can not
remove enough steps to get it to pass):
That suggests a Cucumber setup issue.
Feature: Login logout of system
Scenario: Login
When I am on the login page
Then I should see "Lender Login"
2 scenarios (2 failed)
7 steps (7 skipped)
0m0.042s
rake aborted!
Command failed with status (1):
[/Users/DK/.rvm/rubies/ruby-1.8.7-p174/bin/...]
That does look rather terse -- but notice that all your steps are
showing up as skipped. I'd say you've got a configuration issue. Check
your cucumber setup.
(See full trace by running task with --trace)
DKMac:creditcompare DK$
On Wed, Sep 15, 2010 at 5:06 PM, Marnen Laibow-Koser
That does look rather terse – but notice that all your steps are
showing up as skipped. I’d say you’ve got a configuration issue. Check
your cucumber setup.
So it was a configuration error, having to do with my discovery that the config/environment/cucumber.rb environment which was missing some app specific constants, which in turn was causing my loading of fixtures to fail (albeit unreported).
Now another issue: I have my test::unit fixtures loading and confirmed (this is a legacy app). However they can not seem to be accessed from the code. This is what is in env.rb to load them:
Before do
Fixtures.reset_cache
fixtures_folder = File.join(RAILS_ROOT, ‘test’, ‘fixtures’)
fixtures = Dir[File.join(fixtures_folder, ‘*.yml’)].map {|f| File.basename(f, ‘.yml’) }
Fixtures.create_fixtures(fixtures_folder, fixtures)
end
Then for example, in the cucumber step below, when I set the debugger, I can find, the specific users fixture through Fixtures.all_loaded_fixtures[“users”][“sysadmin_user_one”]
But I can not get at its data (maybe you can tell me how to get at a class attribute inside a fixture object):
(rdb:1) Fixtures.all_loaded_fixtures[“users”][“sysadmin_user_one”]
#<Fixture:0x47776a4 @model_class=User(id: integer, login: string, first_name: string, last_name: string, email: string, role_id: integer, hashed_password: string, salt: string, created_at: datetime, updated_at: datetime, enabled: boolean, account_id: integer, email_upon_upload: boolean), @fixture={“salt”=>987654, “created_at”=>“2010-09-16 18:13:09”, “updated_at”=>“2010-09-16 18:13:09”, “role_id”=>1033329129, “hashed_password”=>“501d40d3a18d954855335c06bd56d47f8f5d4adc”, “id”=>1067249891, “enabled”=>true, “last_name”=>“One”, “login”=>“sysadminone”, “email”=>“sysadminone@gmail.com”, “first_name”=>“Sysadmin”},
And using “users(:user_name)” as I would in Test::Unit does not work - this is where the step is failing.
I hope this is not as disgusting as I am making it… am I fighting the universe (or in this case Cucumber::Rails::World) on this?
Given /^I am logged in as a sysadmin user$/ do
user = users(:sysadmin_user_one)
visit(‘/login’)
fill_in(‘login’, user.login)
fill_in(‘password’, ‘password1’)
click_button(‘Log in’)
I should see ‘Welcome Sysadmin One’
end
That does look rather terse -- but notice that all your steps are
showing up as skipped. I'd say you've got a configuration issue. Check
your cucumber setup.
So it was a configuration error, having to do with my discovery that the
config/environment/cucumber.rb environment which was missing some app
specific constants, which in turn was causing my loading of fixtures to
fail
(albeit unreported).
Now another issue: I have my test::unit fixtures loading and confirmed
(this
is a legacy app). However they can not seem to be accessed from the
code.
Good. You shouldn't be using fixtures in Cucumber -- or indeed at all.
The feature, as implemented in Rails, is broken and should be avoided at
all costs.
Use factories instead (either Machinist or Factory Girl will work). For
integration of factories and Cucumber, Pickle works well.
[...]
I hope this is not as disgusting as I am making it... am I fighting the
universe (or in this case Cucumber::Rails::World) on this?
Given /^I am logged in as a sysadmin user$/ do
user = users(:sysadmin_user_one)
visit('/login')
fill_in('login', user.login)
fill_in('password', 'password1')
click_button('Log in')
I should see 'Welcome Sysadmin One'
end
That step looks good, except for the use of fixtures.
Never mind. I just found this:
http://wiki.github.com/aslakhellesoy/cucumber/fixtures
Which states:
…you can access your fixture data from the database using Model.find. Example to find the first User model you’d use User.find(:first).
So I was just trying to use the Test::Unit way – users{:sysadminone), vs User.find_by_login(‘sysadminone’) – and that was the problem. Works right on.
Good. �You shouldn't be using fixtures in Cucumber -- or indeed at all.
The feature, as implemented in Rails, is broken and should be avoided at
all costs.