Rspec和命名路由

Fab*_*ier 27 ruby-on-rails railstutorial.org

我对rails非常陌生,并试图遵循railstutorial.一切都很顺利,除了我的测试无法通过命名路线(5.3.3)

我的routes.rb:

 SampleApp::Application.routes.draw do

 resources :users
 match '/signup',  to: 'users#new'

 match '/help',    to: 'static_pages#help'
 match '/about',   to: 'static_pages#about'
 match '/contact', to: 'pages#contact'

 root to: 'static_pages#home'

 #Commented stuff
Run Code Online (Sandbox Code Playgroud)

我的第一次测试(spec/controllers/static_pages_controller_spec.rb):

describe "Static pages" do

subject { page }

shared_examples_for "all static pages" do
  it { should have_selector('h1',    text: heading) }
  it { should have_selector('title', text: full_title(page_title)) }
end

describe "Home page" do
  before { visit root_path }
  let(:heading)    { 'Sample App' }
  let(:page_title) { 'Home' }

  it_should_behave_like "all static pages"
end

#Other tests
Run Code Online (Sandbox Code Playgroud)

spec_helper.rb看起来像(没有所有注释的东西)

ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'rspec/autorun'

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

RSpec.configure do |config|
    config.fixture_path = "#{::Rails.root}/spec/fixtures"
    config.use_transactional_fixtures = true
    config.infer_base_class_for_anonymous_controllers = false
end
Run Code Online (Sandbox Code Playgroud)

我从rspec得到的错误都是这样的:

 Static pages Home page it should behave like all static pages 
 Failure/Error: before { visit root_path }
 NameError:
   undefined local variable or method `root_path' for #<RSpec::Core::ExampleGroup::Nested_2::Nested_1::Nested_1:0x00000004a12210>
 Shared Example Group: "all static pages" called from ./spec/controllers/static_pages_controller_spec.rb:17
 # ./spec/controllers/static_pages_controller_spec.rb:13:in `block (3 levels) in <top (required)>'
Run Code Online (Sandbox Code Playgroud)

我已经尝试过了

 include Rails.application.routes.url_helpers
Run Code Online (Sandbox Code Playgroud)

在spec_helper中,但它将我的错误更改为

 Static pages Home page it should behave like all static pages 
 Failure/Error: Unable to find matching line from backtrace
 SystemStackError:
   stack level too deep
 # /usr/lib/ruby/1.9.1/forwardable.rb:185
Run Code Online (Sandbox Code Playgroud)

我也尝试过不同的方式重命名我的路线,但没有一个工作.我回到教程版本.

如果它可以帮助我找到究竟是什么问题,我在Ubuntu 11.10上使用rails 3.2.1和ruby 1.9.2p290.希望你能帮忙,我花了一段时间谷歌搜索解决方案,没有发现任何^^'

Tom*_*m L 111

如果将以下内容放在rspec_helper.rb中,则命名路由应该有效:

RSpec.configure do |config|
  config.include Rails.application.routes.url_helpers
  ...
end
Run Code Online (Sandbox Code Playgroud)

这是你如何设置它?

  • 如果有人做到这一点并且仍然难倒,那么值得注意的是root_path(etc)只能在RSpec测试的"describe"块中的"it"部分的"do ... end"块内工作.因此,如果您基于传递给函数的路径参数创建了处理"it"部分的函数,则无法将root_path(etc)作为参数传递给所述函数. (8认同)