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

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

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

Capybaraは、 Rubyで開発されているWebアプリケーションテストフレームワークです。Webブラウザ不要でブラウザ上のユーザー操作及びJavaScriptの挙動を自動化することができます。

RSpec

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

Ruby on Rails

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

受付中

RSpecのフィーチャースペックでNoMethodError

yokorails
yokorails

総合スコア0

Capybara

Capybaraは、 Rubyで開発されているWebアプリケーションテストフレームワークです。Webブラウザ不要でブラウザ上のユーザー操作及びJavaScriptの挙動を自動化することができます。

RSpec

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

Ruby on Rails

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

0回答

0評価

0クリップ

883閲覧

投稿2019/12/15 14:46

前提・実現したいこと

Everyday RailsでRSpecを勉強している者です。
cloud9
rails 5.1.6を使っています。

RSpecを使ってrails tutorialの投稿機能(メッセージを入れてPostボタンを押したら、"Micropost created!"と表示されるかどうか)のテストがうまくいきません。

capybaraとフィーチャースペックでやってみたのですが、以下のようなエラーが発生しました。

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

Failures: 1) Micropost post_file Failure/Error: click_on 'Post' NoMethodError: undefined method `size' for nil:NilClass # /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/rack-test-1.1.0/lib/rack/test/uploaded_file.rb:47:in `public_send' # /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/rack-test-1.1.0/lib/rack/test/uploaded_file.rb:47:in `method_missing' # /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/rack-test-1.1.0/lib/rack/test/utils.rb:136:in `build_file_part' # /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/rack-test-1.1.0/lib/rack/test/utils.rb:101:in `block in get_parts' # /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/rack-test-1.1.0/lib/rack/test/utils.rb:92:in `each' # /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/rack-test-1.1.0/lib/rack/test/utils.rb:92:in `map' # /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/rack-test-1.1.0/lib/rack/test/utils.rb:92:in `get_parts' # /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/rack-test-1.1.0/lib/rack/test/utils.rb:87:in `build_parts' # /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/rack-test-1.1.0/lib/rack/test/utils.rb:77:in `build_multipart' # /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/rack-test-1.1.0/lib/rack/test.rb:246:in `env_for' # /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/rack-test-1.1.0/lib/rack/test.rb:128:in `custom_request' # /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/rack-test-1.1.0/lib/rack/test.rb:66:in `post' # /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/capybara-2.15.4/lib/capybara/rack_test/browser.rb:69:in `process' # /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/capybara-2.15.4/lib/capybara/rack_test/browser.rb:41:in `process_and_follow_redirects' # /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/capybara-2.15.4/lib/capybara/rack_test/browser.rb:32:in `submit' # /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/capybara-2.15.4/lib/capybara/rack_test/form.rb:78:in `submit' # /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/capybara-2.15.4/lib/capybara/rack_test/node.rb:64:in `click' # /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/capybara-2.15.4/lib/capybara/node/element.rb:143:in `block in click' # /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/capybara-2.15.4/lib/capybara/node/base.rb:85:in `synchronize' # /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/capybara-2.15.4/lib/capybara/node/element.rb:143:in `click' # /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/capybara-2.15.4/lib/capybara/node/actions.rb:25:in `click_link_or_button' # /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/capybara-2.15.4/lib/capybara/session.rb:792:in `block (2 levels) in <class:Session>' # /home/ec2-user/.rvm/gems/ruby-2.6.3/gems/capybara-2.15.4/lib/capybara/dsl.rb:50:in `block (2 levels) in <module:DSL>' # ./spec/features/microposts_spec.rb:14:in `block (3 levels) in <top (required)>' # ./spec/features/microposts_spec.rb:9:in `block (2 levels) in <top (required)>' Finished in 1.58 seconds (files took 2.05 seconds to load) 3 examples, 1 failure Failed examples: rspec ./spec/features/microposts_spec.rb:8 # Micropost post_file

該当のソースコード

以下は実際のテストコード

spec/features/micropost_spec.rb

require 'rails_helper' RSpec.feature "Micropost", type: :feature do before do @user = FactoryBot.create(:user, :foobar, activated: true) log_in_as_foobar end scenario "post_file" do aggregate_failures do expect(page).to have_current_path "/" fill_in "micropost[content]", with: "this is test" textarea = find('#micropost_content') expect(textarea.value).to match "this is test" click_on "Post" expect(page).to have_content "Micropost created!" end end end

以下はMicropostモデルのファイル

class Micropost < ApplicationRecord belongs_to :user default_scope -> { order(created_at: :desc) } mount_uploader :picture, PictureUploader validates :user_id, presence: true validates :content, presence: true, length: { maximum: 140 } validate :picture_size private # アップロードされた画像のサイズをバリデーションする def picture_size if picture.size > 5.megabytes errors.add(:picture, "should be less than 5MB") end end end

試したこと

Postボタンを押すと、nilクラスにsizeメソッドが実行されてしまうとあるのですが、テストでsizeメソッドを使った記憶がありませんでした。

唯一、投稿で一緒に添付できる画像ファイルのバリデーションにsizeメソッド(以下のコード)が使われていたので、その部分をコメントアウトしてもテストの結果は変わりませんでした。

class Micropost < ApplicationRecord #省略 validate :picture_size private # アップロードされた画像のサイズをバリデーションする def picture_size if picture.size > 5.megabytes errors.add(:picture, "should be less than 5MB") end end end

また、click_on "Post" から下の行を削除してテストすると今度は成功しました。

となると、

Failures: 1) Micropost post_file Failure/Error: click_on 'Post' NoMethodError: undefined method `size' for nil:NilClass

このエラーメッセージのundefined method `size' for nil:NilClassは一体何を指しているかわかりません。

詳しい方助けていただけると幸いです。
よろしくお願い致します。

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Capybara

Capybaraは、 Rubyで開発されているWebアプリケーションテストフレームワークです。Webブラウザ不要でブラウザ上のユーザー操作及びJavaScriptの挙動を自動化することができます。

RSpec

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

Ruby on Rails

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