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

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

新規登録して質問してみよう
ただいま回答率
85.50%
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の基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

テスト駆動開発

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

Q&A

解決済

1回答

5179閲覧

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

holly0819

総合スコア17

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の基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

テスト駆動開発

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

0グッド

1クリップ

投稿2019/09/05 07:59

編集2019/09/05 08:05

環境

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の時のみ失敗するようです。

ソースコードをコメントアウトして一括テストしてみるとexamplesの数が減っていたので、ちゃんと拾えてはいると考えています。

$ 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

1Rails.application.routes.draw do 2 3 ~()~ 4 5 # Sessions 6 get '/login', to: 'sessions#new' 7 post '/login', to: 'sessions#create' 8 delete '/logout', to: 'sessions#destroy' 9end

spec/rails_spec.rb

Ruby

1require 'capybara/rspec' 2 3RSpec.configure do |config| 4 5 config.before(:each, type: :system) do 6 driven_by :selenium_chrome_headless 7 end 8 9 config.include Capybara::DSL 10 config.expect_with :rspec do |expectations| 11 expectations.include_chain_clauses_in_custom_matcher_descriptions = true 12 end 13 14 config.mock_with :rspec do |mocks| 15 mocks.verify_partial_doubles = true 16 end 17 18 config.shared_context_metadata_behavior = :apply_to_host_groups 19 20end 21
app/controllers/sessions_controller.rb

Ruby

1class SessionsController < ApplicationController 2 def new 3 end 4 5 def create 6 user = User.find_by(email: params[:session][:email].downcase) 7 if user && user.authenticate(params[:session][:password]) 8 log_in(user) 9 redirect_to user 10 else 11 flash.now[:danger] = 'Invalid email/password combination' 12 render 'new' 13 end 14 end 15 16 def destroy 17 log_out 18 redirect_to root_url 19 end 20end
spec/system/sessions_spec.rb

Ruby

1require 'spec_helper' 2 3describe "Authentication" do 4 5 subject { page } 6 7 describe "signin page" do 8 before { visit '/login' } 9 10 it { should have_title('Log in') } 11 it { should have_content('Log in') } 12 end 13 14 describe "login" do 15 before { visit login_path } 16 17 context "with invalid information" do 18 before { click_button('Log in') } 19 20 it { should have_title('Log in') } 21 it { should have_selector('div.alert.alert-danger', text: 'Invalid') } 22 23 context "when reload" do 24 before { visit login_path } 25 26 it { should_not have_selector('div.alert.alert-danger', text: 'Invalid') } 27 end 28 ~()~ 29 end 30 end 31end

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

winterboum

2019/09/05 08:42

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

2019/09/05 12:17

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

回答1

0

自己解決

先に結論

頂いたアドバイスをもとに試行錯誤した結果、spec/system/sessions_spec.rbの1行目 require 'spec_helper'require 'rails_helper'に書き換えたら直りました。

最初にrequireするファイルを間違えていたようです・・・。

どうやらrequireなどは他のテストにも引き継いでいるようで、複数のテストを同時に実行するときだけうまく行っていたようです。

一番最初にrequire 'rails_helper'がないファイルでテストすると、このようなエラーが発生するみたいですね。

system specにはジェネレータがないようなので、こんなミスが起こってしまいました。気を付けます。

過程

単独だとFとか単独ならOKとか有るのは、他のテストの後始末が不完全で、その影響を受けていることが多いです。

一緒に実行するテストを二分法で切り分けると、副作用を残すテストが見えてくるかと。
そのテストの副作用が何なのかを掴めば通るテストを書けるように。

上記のアドバイスを頂いたので、「副作用」を残しているテストを見分けることにしました。

bash

12$ bundle exec rspec spec/system spec/controllers

結果、どのテストフォルダ/ファイルを指定しても、最初の引数がspec/system/sessions_spec.rb(エラーを起こすコード)ならエラーを引き起こし、それ以外ならテストが通ることがわかりました。

bash

1$ bundle exec rspec spec/system/sessions_spec.rb spec/controllers 2→エラー 3 4$ bundle exec rspec spec/controllers spec/system/sessions_spec.rb 5→OK

なら、空のファイルを最初の引数に指定するとどうなるのか?と思い実行。

bash

1$ bundle exec rspec spec/system/hoge.rb spec/system/sessions_spec.rb 2→エラー発生!

最初の引数がsessions_spec.rb以外にも関わらず、エラーが発生しました。

ここらへんでやっとrequire 'rails_helper'じゃなくてrequire 'spec_helper'を1行目に書くのだと気づき、修正。単独で実行しても成功するようになりました。

Bash

1$ bundle exec rspec spec/system/ 2..................... 3 4Finished in 7.85 seconds (files took 1.98 seconds to load) 521 examples, 0 failures

投稿2019/09/05 12:49

holly0819

総合スコア17

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問