29

我对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

我的第一次测试(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

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

我从 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)>'

我已经尝试过使用

 include Rails.application.routes.url_helpers

在 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

我也尝试了不同的方式来重命名我的路线,但它们都没有奏效。我回到教程版。

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

4

6 回答 6

114

如果将以下内容放入 rspec_helper.rb 中,命名路由应该可以工作:

RSpec.configure do |config|
  config.include Rails.application.routes.url_helpers
  ...
end

你是这样设置的吗?

于 2012-02-28T04:50:36.767 回答
3

我认为您无法访问 rspec 控制器规范中的命名路由。但是,您可以只做 visit('/'),​​这相当于 root_path。

于 2012-02-28T03:10:25.057 回答
3

谷歌把我带到了这里,即使我的错误信息也不适合 100%。

在我的情况下,Capybara 命令visit是未知的......

错误:

NoMethodError:
       undefined method `visit' for #<RSpec::Core::ExampleGroup::Nested_1::Nested_1:0xa49a73c>

由于 Capybara 2.0 必须使用文件夹spec/featurescapybara 命令不再在文件夹中工作spec/requests

这对我有帮助:http: //alindeman.github.com/2012/11/11/rspec-rails-and-capybara-2.0-what-you-need-to-know.html

希望你觉得这很有用。

于 2013-03-25T20:55:51.333 回答
2

你应该用过

rails generate rspec:install

代替

rspec --init

而且您不必修改配置文件。

但是现在不要这样做,否则您的应用程序将崩溃,您将不得不浪费更多时间来弄清楚它为什么会崩溃。

于 2012-08-13T13:56:11.890 回答
2

我有同样的问题,使用相同的教程。事实证明,我只需要重新启动 Spork 服务,一切正常。

Tom L 发布的解决方案对我有用,但是当我删除该行并重新启动 Spork 时,这也解决了问题。

希望对任何其他对偏离教程代码持谨慎态度的人有所帮助!

于 2012-10-23T07:58:53.720 回答
1

如果您将以下内容放入rails_helper.rb而不是 spec_helper.rb,则命名路由应该可以工作:

在我的 rails_helper.rb 代码处结帐


# This file is copied to spec/ when you run 'rails generate rspec:install'
require 'spec_helper'
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../config/environment', __dir__)
# Prevent database truncation if the environment is production
if Rails.env.production?
  abort('The Rails environment is running in production mode!')
end
require 'rspec/rails'
require 'capybara/rails'
RSpec.configure do |config|
  config.include Rails.application.routes.url_helpers
  config.include Devise::Test::ControllerHelpers, type: :controller
  config.include Devise::Test::ControllerHelpers, type: :view
  config.include Warden::Test::Helpers
end

begin
  ActiveRecord::Migration.maintain_test_schema!
rescue ActiveRecord::PendingMigrationError => e
  puts e.to_s.strip
  exit 1
end
RSpec.configure do |config|
  # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
  config.fixture_path = "#{::Rails.root}/spec/fixtures"

  config.use_transactional_fixtures = true

  config.infer_spec_type_from_file_location!

  # Filter lines from Rails gems in backtraces.
  config.filter_rails_from_backtrace!
end

于 2020-03-30T19:01:04.270 回答