Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

RSpec not finding my named routes

I'm having an inexplicably hard time getting my named routes to work within my rspec tests.

Here's what I'm seeing:

1) Home GET / works!
 Failure/Error: get root_path
 NameError:
   undefined local variable or method `root_path' for #<RSpec::Core::ExampleGroup::Nested_1::Nested_1:0x007fe13b0c1538>
 # ./spec/requests/home_spec.rb:6:in `block (3 levels) in <top (required)>'

2) Home GET / shows products!
 Failure/Error: get products_path
 NameError:
   undefined local variable or method `products_path' for #<RSpec::Core::ExampleGroup::Nested_1::Nested_1:0x007fe13b0cdea0>
 # ./spec/requests/home_spec.rb:10:in `block (3 levels) in <top (required)>'

spec/requests/home_spec.rb

require 'spec_helper'

describe "Home" do
  describe "GET /" do
    it "works!" do
      get root_path
      response.status.should be(200)
    end
    it "shows products!" do
      get products_path
      response.status.should be(200)
    end
  end  
end

spec/spec_helper.rb

# This file is copied to spec/ when you run 'rails generate rspec:install'
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'rspec/autorun'

# 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}

require 'spree/core/testing_support/factories'

RSpec.configure do |config|
  config.mock_with :rspec
  config.fixture_path = "#{::Rails.root}/spec/fixtures"
  config.use_transactional_fixtures = true
  config.infer_base_class_for_anonymous_controllers = false
  config.before(:suite) do
    # DatabaseCleaner.strategy = :truncation
  end
  config.before(:each) do
    # DatabaseCleaner.start
  end
  config.after(:each) do
    # DatabaseCleaner.clean
  end

  config.include Rails.application.routes.url_helpers
end

You can see that the test is including spec_helper, and spec_helper is including the routing methods. Here's my rake routes:

bundle exec rake routes

...
             root        /                        spree/home#index
         products GET    /products(.:format)      spree/products#index
...

Any idea what could be going on here to prevent the routes from working? Thanks!

like image 970
isthmuses Avatar asked Sep 30 '13 18:09

isthmuses


1 Answers

If you're wanting to reference the route of an engine from tests within an dummy application, or just an application itself, then you'll need to prefix the routing helpers with the engine name. For Spree, you would reference the routes like:

spree.products_path

Similarly, if you want to reference routes of the main application from an engine, you'll need to use main_app:

main_app.root_path
like image 184
Ryan Bigg Avatar answered Sep 26 '22 05:09

Ryan Bigg