web-dev-qa-db-ja.com

Rspecと名前付きルート

私は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 。お役に立てれば幸いです。解決策を探すのにかなりの時間を費やしましたが、何も見つかりませんでした^^ '

27
FabPelletier

名前付きルートは、rspec_helper.rbに以下を配置した場合に機能します。

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

それはあなたがそれをどのように設定したのですか?

108
Tom L

rspec_helper.rb内:

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

グーグルは私をここに連れて行ってくれました、私のエラーメッセージでさえ100%適合しません。

私の場合、カピバラコマンドvisitis unknown ...

エラー:

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

Capybara 2.0以降では、フォルダーspec/featuresを使用する必要があります。capybaraコマンドは、フォルダーspec/requestsでは機能しなくなりました。

それは私を助けました: http://alindeman.github.com/2012/11/11/rspec-Rails-and-capybara-2.0-what-you-need-to-know.html

この情報がお役に立てば幸いです。

3
BBQ Chef

私はあなたがあなたのrspecコントローラ仕様の中で名前付きルートにアクセスできないと思います。ただし、root_pathに相当するvisit( '/')を実行することもできます。

2
TheDelChop

同じチュートリアルで同じ問題が発生しました。 Sporkサービスを再起動する必要があることがわかりました。すべて正常に機能しました。

Tom Lによって投稿されたソリューションは私にとってはうまくいきましたが、その行を削除してSporkを再起動すると、問題も修正されました。

チュートリアルのコードから逸脱することに警戒している他の人々を助けることを願っています!

2
csalvato

あなたは使用すべきだった

Rails generate rspec:install

の代わりに

rspec --init

設定ファイルを変更する必要はありませんでした。

ただし、今はしないでください。そうしないと、アプリケーションが壊れて、壊れた理由を解明するのにもう少し時間を費やす必要があります。

1
Benoît Legat

名前付きルートは、spec_helper.rbではなくRails_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

0
Carlos