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

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

新規登録して質問してみよう
ただいま回答率
87.20%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

テスト駆動開発

テスト駆動開発は、 プログラム開発手法の一種で、 プログラムに必要な各機能をテストとして書き、 そのテストが動作する必要最低限な実装を行い コードを洗練させる、といったサイクルを繰り返す手法の事です。

解決済

Rails:RSpec ファイル指定の時のみテストが失敗する

holly0819
holly0819

総合スコア0

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

テスト駆動開発

テスト駆動開発は、 プログラム開発手法の一種で、 プログラムに必要な各機能をテストとして書き、 そのテストが動作する必要最低限な実装を行い コードを洗練させる、といったサイクルを繰り返す手法の事です。

1回答

0評価

1クリップ

3126閲覧

投稿2019/09/05 07:59

編集2022/01/12 10:58

環境

Amazon Linux AMI release 2018.03
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux]
Rails 5.1.7
rspec-rails 3.8.2
capybara 3.29.0
factory_bot_rails 5.0.2
selenium-webdriver 3.142.4

前提・実現したいこと

Railsチュートリアル(第四版)の2週目を進めている最中で、テストにはRSpecを使用しています。

過去にチュートリアルではRSpecを使っていた(第二版)ので、参考がてら時々そちらも見ています。

8章を終えて、テストを実行するとファイル指定の時のみなぜかテストが失敗してしまいます。

調べてみても解決できなかったため、ご教示ください。

発生している問題・エラーメッセージ

フォルダを指定して、テストを一括で実行すると全部通ります。

$ bundle exec rspec spec ....................................................... Finished in 11.02 seconds (files took 1.97 seconds to load) 55 examples, 0 failures

しかし、あるファイルspec/system/sessions_spec.rbを指定してテストを実行すると失敗します。

他のファイルも指定して実行したのですが、こちらの方は全部成功しました。つまり、sessions_spec.rbの時のみ失敗するようです。

$ bundle exec rspec spec/system/sessions_spec.rb FFFFFFFFF Failures: 1) Authentication signin page Failure/Error: before { visit login_path } NameError: undefined local variable or method `login_path' for #<RSpec::ExampleGroups::Authentication::SigninPage:0x0000000001abd168> # ./spec/system/sessions_spec.rb:8:in `block (3 levels) in <top (required)>' (~略~)

後述するソースコードのvisit login_pathvisit '/login'に書き換えたところ、やはりファイル指定の場合のみテストが失敗し、次のようなエラーコードが出ました。

それからArgumentError: rack-test requires a rack application, but none was givenについて調べてみたのですが、結局解決できず質問させていただく形となりました。

$ bundle exec rspec spec/system/sessions_spec.rb FFFFFFFFF Failures: 1) Authentication signin page Got 0 failures and 2 other errors: 1.1) Failure/Error: before { visit '/login' } ArgumentError: rack-test requires a rack application, but none was given # /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/capybara-3.29.0/lib/capybara/rack_test/driver.rb:18:in `initialize' # /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/capybara-3.29.0/lib/capybara/registrations/drivers.rb:4:in `new' # /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/capybara-3.29.0/lib/capybara/registrations/drivers.rb:4:in `block in <top (required)>' # /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/capybara-3.29.0/lib/capybara/session.rb:102:in `driver' # /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/capybara-3.29.0/lib/capybara/session.rb:276:in `visit' # /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/capybara-3.29.0/lib/capybara/dsl.rb:51:in `block (2 levels) in <module:DSL>' # ./spec/system/sessions_spec.rb:8:in `block (3 levels) in <top (required)>' (~略~)

該当のソースコード

config/routes.rb

Ruby

Rails.application.routes.draw do ~(略)~ # Sessions get '/login', to: 'sessions#new' post '/login', to: 'sessions#create' delete '/logout', to: 'sessions#destroy' end

spec/rails_spec.rb

Ruby

require 'capybara/rspec' RSpec.configure do |config| config.before(:each, type: :system) do driven_by :selenium_chrome_headless end config.include Capybara::DSL 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
app/controllers/sessions_controller.rb

Ruby

class SessionsController < ApplicationController def new end def create user = User.find_by(email: params[:session][:email].downcase) if user && user.authenticate(params[:session][:password]) log_in(user) redirect_to user else flash.now[:danger] = 'Invalid email/password combination' render 'new' end end def destroy log_out redirect_to root_url end end
spec/system/sessions_spec.rb

Ruby

require 'spec_helper' describe "Authentication" do subject { page } describe "signin page" do before { visit '/login' } it { should have_title('Log in') } it { should have_content('Log in') } end describe "login" do before { visit login_path } context "with invalid information" do before { click_button('Log in') } it { should have_title('Log in') } it { should have_selector('div.alert.alert-danger', text: 'Invalid') } context "when reload" do before { visit login_path } it { should_not have_selector('div.alert.alert-danger', text: 'Invalid') } end ~(略)~ end end end

良い質問の評価を上げる

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

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

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

気になる質問をクリップする

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

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

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

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

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

winterboum
winterboum

2019/09/05 08:42

単独だとFとか単独ならOKとか有るのは、他のテストの後始末が不完全で、その影響を受けていることが多いです。 一緒に実行するテストを二分法で切り分けると、副作用を残すテストが見えてくるかと。 そのテストの副作用が何なのかを掴めば通るテストを書けるように。
holly0819
holly0819

2019/09/05 12:17

情報ありがとうございます。 頂いたアドバイスの通りやってみると、なんとか解決することができました! sessions_spec\.rbの1行目がrequire 'rails_helper'ではなく、require 'spec_helper'となっているのが問題でした・・・。 どんなテストファイルでも同時に実行するとOKが出たので、試しに空のファイルと一緒に実行してみるとエラー発生となり、ようやくこのミスに気づけました。 winterboumさんのアドバイスのおかげでスッキリできました。ありがとうございます。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

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

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

テスト駆動開発

テスト駆動開発は、 プログラム開発手法の一種で、 プログラムに必要な各機能をテストとして書き、 そのテストが動作する必要最低限な実装を行い コードを洗練させる、といったサイクルを繰り返す手法の事です。