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

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

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

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

RSpec

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

Ruby on Rails

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

Q&A

0回答

1162閲覧

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

yokorails

総合スコア4

Capybara

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

RSpec

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

Ruby on Rails

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

0グッド

0クリップ

投稿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

1require 'rails_helper' 2 3RSpec.feature "Micropost", type: :feature do 4 before do 5 @user = FactoryBot.create(:user, :foobar, activated: true) 6 log_in_as_foobar 7 end 8 9 scenario "post_file" do 10 aggregate_failures do 11 expect(page).to have_current_path "/" 12 fill_in "micropost[content]", with: "this is test" 13 textarea = find('#micropost_content') 14 expect(textarea.value).to match "this is test" 15 click_on "Post" 16 expect(page).to have_content "Micropost created!" 17 end 18 end 19end

以下は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は一体何を指しているかわかりません。

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

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問