前提・実現したいこと
rails tutorialが最後まで終わってで返信機能の実装している途中でした。
https://qiita.com/ac23811s/items/4db96b63158179b31a40
上記のサイトを参考に進めていましたが
rails testでエラーが出てしまい解決できなくなってしまいました。
どのような内容のエラーなのか、どのように解決すれば良いのか
教えて頂けたらより勉強になり助かります。
発生している問題・エラーメッセージ
FAIL["test_user_nick_name_test_in_index", #<Minitest::Reporters::Suite:0x000055c6077bb3d0 @name="SiteLayoutTest">, 1.5860779539998475] test_user_nick_name_test_in_index#SiteLayoutTest (1.59s) <Michael Example @Michael> expected but was <Michael Example @michael>.. Expected 0 to be >= 1. test/integration/site_layout_test.rb:43:in `block in <class:SiteLayoutTest>' ERROR["test_input_reply_to_id", #<Minitest::Reporters::Suite:0x000055c607f96ca8 @name="MicropostTest">, 2.4960221930000444] test_input_reply_to_id#MicropostTest (2.50s) NoMethodError: NoMethodError: undefined method `id' for nil:NilClass test/models/micropost_test.rb:34:in `block in <class:MicropostTest>' FAIL["test_micropost_reply", #<Minitest::Reporters::Suite:0x000055c60756c728 @name="MicropostsInterfaceTest">, 2.9545529110000643] test_micropost_reply#MicropostsInterfaceTest (2.96s) Expected /@Archer\ @Lana\ This\ micropost\ is\ test\ for\ reply./ to not match "<!DOCTYPE html>\n<html>\n <head>\n <title>Ruby on Rails Tutorial Sample App</title>\n \n\n\n<link rel=\"stylesheet\" media=\"all\" href= "/assets/application-18413e803aa17286e1dc07ffaa442fca6b46256ba3aee297f0e66afddac78028.css\" data-turbolinks- 省略:::コードの内容 <a href=\"/about\">About</a></li>\n <li><a href=\"/contact\">Contact</a></li>\n <li><a herf=\"https://news.railstutorial.org/\">News</a></li>\n </ul>\n </nav>\n</footer>\n \n </div>\n </body>\n</html>\n". test/integration/microposts_interface_test.rb:79:in `block in <class:MicropostsInterfaceTest>' FAIL["test_micropost_interface", #<Minitest::Reporters::Suite:0x000055c608118f18 @name="MicropostsInterfaceTest">, 3.308759449000263] test_micropost_interface#MicropostsInterfaceTest (3.31s) <Michael Example @Michael> expected but was <Sterling Archer @Archer>.. Expected 0 to be >= 1.
該当のソースコード
user.rb
1class User < ApplicationRecord 2 省略 3 4 5 #ニックネームは保存前に小文字にする 6 before_save :downcase_nick_name 7 #ユーザモデルにニックネームを追加 8 VALID_NICKNAME_REGEX = /\A[\w]+\z/i 9 validates :nick_name, presence:true, length:{maximum:15}, 10 format: {with: VALID_NICKNAME_REGEX }, 11 uniqueness: { case_sensitive: false } 12 13 省略 14 15 def feed 16 #スケールしたステータスフィードを返す 17 following_ids = "SELECT followed_id FROM relationships 18 WHERE follower_id = :user_id" 19 Micropost.where("user_id IN (#{following_ids}) OR user_id = :user_id",user_id: id) 20 .where(reply_to: [nil,""]) 21 .or(Micropost.where(reply_to: id).or(Micropost.where(reply_from: id))) 22 end 23 24 省略 25 26 27 private 28 29 def downcase_email 30 email.downcase! 31 end 32 33 def create_activation_digest 34 self.activation_token = User.new_token 35 self.activation_digest = User.digest(activation_token) 36 end 37 38 def downcase_nick_name 39 self.nick_name.downcase! 40 end 41 42end
microposts.controller.rb
1class MicropostsController < ApplicationController 2 before_action :logged_in_user, only: [:create, :destroy] 3 before_action :correct_user, only: :destroy 4 5 def create 6 @micropost = current_user.microposts.build(micropost_params) 7 #正規表現のフォーマット作成 8 nickname_regex = /@([\w]{1,15})/i 9 #正規表現にマッチするものを探す 10 @micropost.content.match(nickname_regex) 11 #あったらニックネームからユーザを探す、なければ$1がnilになる 12 if $1 13 reply_user = User.find_by(nick_name: $1.downcase) 14 #ユーザがいたらカラムにセット 15 @micropost.reply_to = reply_user.id if reply_user 16 @micropost.reply_from = current_user.id 17 end 18 省略 19 end 20 21 省略 22 23 private 24 25 def micropost_params 26 params.require(:micropost).permit(:content, :picture, :reply_to, :reply_from) 27 end 28 29 省略 30end
site_layout_test.rb
1require 'test_helper' 2 3class SiteLayoutTest < ActionDispatch::IntegrationTest 4 5 省略 6 7 def setup 8 @user = users(:michael) 9 end 10 11 省略 12 13 14 test "user nick_name test in index" do 15 log_in_as(@user) 16 get root_path 17 assert_select 'h1', text: "#{@user.name} @#{@user.nick_name}" 18 end 19end
micropost_test.rb
1require 'test_helper' 2 3class MicropostTest < ActiveSupport::TestCase 4 def setup 5 @user = users(:michael) 6 @micropost = @user.microposts.build(content: "Lorem ipsum") 7 end 8 9 省略 10 11 test "input reply_to id" do 12 #reply_toに宛先を入れる 13 reply_to = @user.microposts.build(content: "This is Reply Test", reply_to: @replyto.id, reply_from: @user.id) 14 #宛先が入っているか確認 15 assert_equal reply_to.reply_to, @replyto.id 16 assert_equal reply_to.reply_from, @user.id 17 end 18 19end
micropost_interface_test.rb
1require 'test_helper' 2 3class MicropostsInterfaceTest < ActionDispatch::IntegrationTest 4 5 def setup 6 @user = users(:michael) 7 @replyto = users(:archer) 8 @replyto2 =users(:lana) 9 end 10 11 省略 12 test "micropost reply" do 13 log_in_as(@user) 14 get root_path 15 # 有効な送信 16 content = "@#{@replyto.nick_name} @#{@replyto2.nick_name} This micropost is test for reply." 17 post microposts_path, params: { micropost: { content: content } } 18 19 get root_path 20 #送信者に表示されているかチェック 21 assert_match @user.microposts.first.reply_to.to_s, @replyto.id.to_s 22 assert_match @user.microposts.first.reply_from.to_s, @user.id.to_s 23 assert_match content, response.body 24 25 # 受信者に表示されているかチェック 26 log_in_as(@replyto) 27 get root_path 28 assert_match content, response.body 29 30 # 送信者のフォロワー/受信者のフォロワーに表示されていないかチェック 31 log_in_as(@replyto2) 32 get root_path 33 assert_match content, response.body 34 35 end 36end
試したこと
コードの見直し
エラーについて調べた
あなたの回答
tips
プレビュー