前提・実現したいこと
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は一体何を指しているかわかりません。
詳しい方助けていただけると幸いです。
よろしくお願い致します。
あなたの回答
tips
プレビュー