質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.19%

『Ruby on Rails 5 速習実践ガイド』のRSpecで「visit 〇〇_path」が使用できない

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,858

runes224

score 14

前提・実現したいこと

現場で使えるRubyonRails5速習実践ガイドをDocker環境で学習しています。
Rspecでの検証において、visit task_path(task_a)でエラーが出ました。

NameError:undefined local variable or method 'task_a' for #<RSpec::ExampleGroups::Nested::Nested_2::A:0x000055f5b4270a60>

調べてみると、spec_helper.rbに以下を追加すると解決するそうなのですが、次はRails.application.routes.url_helpersが読み込めないというエラーが発生してしまいます。

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

参考
stackoverflow「Rspec and named routes」

エラーメッセージ

An error occurred while loading spec_helper.
Failure/Error: config.include Rails.application.routes.url_helpers

NameError:
  uninitialized constant Rails
# ./spec/spec_helper.rb:19:in `block in <top (required)>'
# ./spec/spec_helper.rb:18:in `<top (required)>'

An error occurred while loading ./spec/system/tasks_spec.rb.
Failure/Error: config.include Rails.application.routes.url_helpers

NameError:
  uninitialized constant Rails
# ./spec/spec_helper.rb:19:in `block in <top (required)>'
# ./spec/spec_helper.rb:18:in `<top (required)>'
# ./spec/rails_helper.rb:2:in `require'
# ./spec/rails_helper.rb:2:in `<top (required)>'
# ./spec/system/tasks_spec.rb:1:in `require'
# ./spec/system/tasks_spec.rb:1:in `<top (required)>'
No examples found.

該当のソースコード

spec/system/tasks_spec.rb

require 'rails_helper'

describe 'タスク管理機能',type: :system do
  describe '一覧表示機能' do
    let(:user_a){ FactoryBot.create(:user, name: 'ユーザーA', email: 'a@example.com') }
    let(:user_b){ FactoryBot.create(:user, name: 'ユーザーB', email: 'b@example.com') }
    let!(:task_a){ FactoryBot.create(:task, name: '最初のタスク', user: user_a) }

    before do
      FactoryBot.create(:task, name: '最初のタスク', user: user_a)
      visit login_path
      fill_in 'メールアドレス', with: login_user.email
      fill_in 'パスワード', with: login_user.password
      click_button 'ログインする'
    end

    context 'ユーザーAがログインしているとき' do
      let(:login_user) { user_a }

      it 'ユーザーAが作成したタスクが表示される' do
        expect(page).to have_content '最初のタスク'
      end
    end

    context 'ユーザーBがログインしているとき' do
      let(:login_user) { user_b }

      it 'ユーザーAが作成したタスクが表示されない' do
        # ユーザーAが作成したタスクが画面上に表示されないことを確認
        expect(page).not_to have_content '最初のタスク'
      end
    end
  end

  describe '詳細表示機能' do
    context 'ユーザーAがログインしているとき' do
      let(:login_user) { user_a }

      before do
        visit task_path(task_a)
      end

      it 'ユーザーAが作成したタスクが表示される' do
        expect(page).to have_content '最初のタスク'
      end
    end
  end
end

spec/spec_helper.rb

require 'capybara/rspec'

RSpec.configure do |config|
  config.include Rails.application.routes.url_helpers
  config.before(:each, type: :system) do
    driven_by :selenium_chrome_headless
  end

  config.expect_with :rspec do |expectations|
    expectations.include_chain_clauses_in_custom_matcher_descriptions = true
  end

  config.mock_with :rspec do |mocks|
    mocks.verify_partial_doubles = true
  end

  config.shared_context_metadata_behavior = :apply_to_host_groups

end

spec/rails_helper.rb

require 'spec_helper'
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
abort("The Rails environment is running in production mode!") if Rails.env.production?
require 'rspec/rails'

begin
  ActiveRecord::Migration.maintain_test_schema!
rescue ActiveRecord::PendingMigrationError => e
  puts e.to_s.strip
  exit 1
end

RSpec.configure do |config|
  config.fixture_path = "#{::Rails.root}/spec/fixtures"
  config.use_transactional_fixtures = true
  config.infer_spec_type_from_file_location!
  config.filter_rails_from_backtrace!
end

Gemfile

source 'https://rubygems.org'


# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 5.1.4'
# Use postgresql as the database for Active Record
gem 'pg', '~> 0.18'
# Use Puma as the app server
gem 'puma', '~> 3.7'
# Use SCSS for stylesheets
gem 'sass-rails', '~> 5.0'
# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'
# See https://github.com/rails/execjs#readme for more supported runtimes
# gem 'therubyracer', platforms: :ruby

# Use CoffeeScript for .coffee assets and views
gem 'coffee-rails', '~> 4.2'
# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks
gem 'turbolinks', '~> 5'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 2.5'
# Use Redis adapter to run Action Cable in production
# gem 'redis', '~> 3.0'
# Use ActiveModel has_secure_password
gem 'bcrypt', '~> 3.1.7'

# Use Capistrano for deployment
# gem 'capistrano-rails', group: :development

group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  gem 'factory_bot_rails', '~> 4.11'
  # Adds support for Capybara system testing and selenium driver
  gem 'capybara', '~> 2.13'
  gem 'selenium-webdriver'
  gem 'webdrivers', '~> 3.0'
  gem 'rspec-rails', '~> 3.7'
  gem 'rails-controller-testing'
end

group :development do
  # Access an IRB console on exception pages or by using <%= console %> anywhere in the code.
  gem 'web-console', '>= 3.3.0'
  gem 'listen', '>= 3.0.5', '< 3.2'
  # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
  gem 'spring'
  gem 'spring-watcher-listen', '~> 2.0.0'
end

# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]

# for slim
gem 'slim-rails'
gem 'html2slim'

gem 'bootstrap'

gem 'rails_autolink'

補足情報(FW/ツールのバージョンなど)

  • Docker version 18.09.2
  • docker-compose version 1.23.2
  • ruby 2.5.5
  • Rails 5.2.3
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

こんばんは。
以下の部分を実行する際に、task_aという変数やメソッドなんて無いよ!と言われていますよね。

specの最初の方で、let!(:task_a) { ... } としているものの、これは describe '一覧表示機能' do ... end の中でしか適用されないと思います。
(describeの入れ子になっていますが、範囲をよく確認してみてくださいね)

ほかにも方法はあるかと思いますが、letおよびlet!の部分を、describe 'タスク管理機能',type: :system do  の直下に持っていけばいいのではないでしょうか。

(spec_helper.rbの調整は多分しなくて大丈夫かなと思います)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/07/07 09:46

    単純なミスだったのですね。ありがとうございました!

    キャンセル

  • 2019/07/07 10:02

    動かしてないのでわかりませんが、大丈夫でしたらよいですが^^

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.19%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る