How do we include support helpers in request specs?

Hi, all :slight_smile:

I have some working support helpers defined in spec/support/
controller_macros.rb.

I’m running “rake spec” before a ‘git commit’ and observed that the
spec request for my ‘brands’ controller,
spec/requests/brands_spec.rb fails because a support helper method I
defined in spec/support/controller_macros.rb is not
recognised.

I got the following error:

----------------- Error extract: start ---------------------------

spec/requests/brands_spec.rb:4:in block in <top (required)>': undefined local variable or method login_admin_user’ for #<Class:
0x00000103bdf9a8> (NameError)
from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.6.4/lib/
rspec/core/example_group.rb:142:in module_eval' from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.6.4/lib/ rspec/core/example_group.rb:142:in subclass’
from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.6.4/lib/
rspec/core/example_group.rb:129:in describe' from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.6.4/lib/ rspec/core/dsl.rb:5:in describe’
from /Users/anexiole/projects/try_rails/spec/requests/brands_spec.rb:
3:in <top (required)>' from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/activesupport-3.0.9/lib/ active_support/dependencies.rb:235:in load’
from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/activesupport-3.0.9/lib/
active_support/dependencies.rb:235:in block in load' from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/activesupport-3.0.9/lib/ active_support/dependencies.rb:227:in load_dependency’
from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/activesupport-3.0.9/lib/
active_support/dependencies.rb:235:in load' from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.6.4/lib/ rspec/core/configuration.rb:419:in block in load_spec_files’
from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.6.4/lib/
rspec/core/configuration.rb:419:in map' from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.6.4/lib/ rspec/core/configuration.rb:419:in load_spec_files’
from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.6.4/lib/
rspec/core/command_line.rb:18:in run' from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.6.4/lib/ rspec/core/runner.rb:80:in run_in_process’
from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.6.4/lib/
rspec/core/runner.rb:69:in run' from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/rspec-core-2.6.4/lib/ rspec/core/runner.rb:11:in block in autorun’
rake aborted!

----------------- Error extract: end ---------------------------

I noticed that in the stack, the helper file, spec/support/
controller_macros.rb was never called.
My model, view and controller specs all pass.

This is what my spec/spec_helper.rb file looks like:

---------- spec/spec_helper.rb start -------------------

ENV[“RAILS_ENV”] ||= ‘test’
require File.expand_path(“…/…/config/environment”, FILE)
require ‘rspec/rails’
require ‘webrat’

Requires supporting ruby files with custom matchers and macros, etc,

in spec/support/ and its subdirectories.

Dir[Rails.root.join(“spec/support/**/*.rb”)].each {|f| require f}

RSpec.configure do |config|

== Mock Framework

If you prefer to use mocha, flexmock or RR, uncomment the

appropriate line:

config.mock_with :mocha

config.mock_with :flexmock

config.mock_with :rr

#: config.mock_with :rspec
config.include Devise::TestHelpers, :type => :controller
config.extend ControllerMacros, :type => :controller

config.before(:suite) do
DatabaseCleaner.strategy = :transaction
DatabaseCleaner.clean_with(:truncation)
end

config.before(:each) do
DatabaseCleaner.start
end

config.after(:each) do
DatabaseCleaner.clean
end

# Rspec 2-GitHub - heartcombo/devise: Flexible authentication solution for Rails with Warden.

config.include Devise::TestHelpers, :type => :controller

Remove this line if you’re not using ActiveRecord or ActiveRecord

fixtures

config.fixture_path = “#{::Rails.root}/spec/fixtures”

If you’re not using ActiveRecord, or you’d prefer not to run each

of your

examples within a transaction, remove the following line or assign

false

instead of true.

config.use_transactional_fixtures = true

end

---------- spec/spec_helper.rb end -------------------

This is what the failing request spec, spec/request/brands_spec.rb
looks like. As this resource will not be available to non-admin users,
it will redirect non-admin users to the root url. To have this spec
passing, I am calling the method, login_admin_user which uses factory
girl to create an admin user object (and sign in). This works without
any problems in the controller specs, spec/controller,
brands_controller_spec.rb. Strangely, it fails to work here regardless
of where I put the call to login_admin_user right after ‘describe
“Brands” do’ or ’ describe “GET /brands” do’.

------------ spec/request/brands_spec.rb start ------------------
require ‘spec_helper’

describe “Brands” do
login_admin_user

describe “GET /brands” do
it “works! (now write some real specs)” do
get brands_path
response.status.should be(200)
end
end
end

------------ spec/request/brands_spec.rb end ------------------

Can someone please show me how do I ensure that helper methods defined
in spec/support get called in spec/request specs?

thank you :slight_smile:

On Oct 13, 2011, at 10:40 PM, Gordon wrote:

rspec/core/example_group.rb:142:in subclass' from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/activesupport-3.0.9/lib/ rspec/core/command_line.rb:18:inrun’

require File.expand_path("…/…/config/environment", FILE)

If you prefer to use mocha, flexmock or RR, uncomment the

appropriate line:

config.mock_with :mocha

config.mock_with :flexmock

config.mock_with :rr

#: config.mock_with :rspec
config.include Devise::TestHelpers, :type => :controller
config.extend ControllerMacros, :type => :controller

:type => :controller will only include it in controller specs. If you
want to include them in requests, you need to add this:

config.extend ControllerMacros, :type => :requests