現在Railsで家計簿アプリを作っており、
System Specで以下のようにテストを書いています。
IncomesSpec
1require 'rails_helper' 2 3RSpec.describe 'Incomes', type: :system do 4 5 it "incomeの新規登録" do 6 # トップページへアクセス 7 visit root_path 8 #収入を記録ボタンを押す 9 expect(page).to have_content '収入を記録' 10 click_link '収入を記録' 11 #値を全て入力せずCreate Incomeボタンを押す 12 expect(page).to have_content 'Create Income' 13 click_button 'Create Income' 14 #income/newページをrender 15 visit current_path 16 〜略〜 17
私の想定では
0. トップページで収入を記録をクリック
0. 収入の新規登録ページに遷移
0. 空欄のままCreate Incomeボタンを押し、エラーによってページを再度読み込み
という流れなのですが、テストを実行したところ
ErrorCode
1 # --- Caused by: --- 2 # Capybara::ExpectationNotMet: 3 # expected to find text "Create Income" in "ホーム\n収入を記録\n支出を記録\n収入を確認\n支出を確認\n家計簿アプリ\nこれは家計簿のアプリです。\nページ上部から項目を選んで記入してください\n今月の収支\n収入:0円\n支出:0円" 4 # ./spec/system/incomes_spec.rb:16:in `block (2 levels) in <top (required)>'
このようなエラーが表示され、ログは以下のようになっています。
TestLog
1 [1m[35m (0.2ms)[0m [1m[34mSELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC[0m 2 [1m[35m (0.1ms)[0m [1m[36mbegin transaction[0m 3Started GET "/" for 127.0.0.1 at 2020-01-29 15:45:42 +0900 4Processing by StaticPagesController#home as HTML 5 Rendering static_pages/home.html.erb within layouts/application 6 [1m[35m (0.3ms)[0m [1m[34mSELECT SUM("incomes"."price") FROM "incomes" WHERE "incomes"."date" BETWEEN ? AND ?[0m [["date", "2020-01-01"], ["date", "2020-01-31"]] 7 [1m[36mIncome Load (0.2ms)[0m [1m[34mSELECT "incomes".* FROM "incomes" WHERE "incomes"."date" BETWEEN ? AND ? ORDER BY "incomes"."date" DESC[0m [["date", "2020-01-01"], ["date", "2020-01-31"]] 8 [1m[35m (0.2ms)[0m [1m[34mSELECT SUM("expenses"."price") FROM "expenses" WHERE "expenses"."date" BETWEEN ? AND ?[0m [["date", "2020-01-01"], ["date", "2020-01-31"]] 9 [1m[36mExpense Load (0.2ms)[0m [1m[34mSELECT "expenses".* FROM "expenses" WHERE "expenses"."date" BETWEEN ? AND ? ORDER BY "expenses"."date" DESC[0m [["date", "2020-01-01"], ["date", "2020-01-31"]] 10 Rendered static_pages/home.html.erb within layouts/application (10.3ms) 11 Rendered layouts/_header.html.erb (1.1ms) 12Completed 200 OK in 72ms (Views: 30.6ms | ActiveRecord: 1.6ms) 13Started GET "/assets/tempusdominus-bootstrap-4.css" for 127.0.0.1 at 2020-01-29 15:45:42 +0900 14Started GET "/incomes/new" for 127.0.0.1 at 2020-01-29 15:45:44 +0900 15Processing by IncomesController#new as HTML 16 Rendering incomes/new.html.erb within layouts/application 17 Rendered incomes/new.html.erb within layouts/application (533.6ms) 18 Rendered layouts/_header.html.erb (0.4ms) 19Completed 200 OK in 665ms (Views: 553.6ms | ActiveRecord: 0.5ms) 20 [1m[35m (0.1ms)[0m [1m[31mrollback transaction[0m 21 [1m[35m (0.1ms)[0m [1m[36mbegin transaction[0m 22 [1m[35m (0.1ms)[0m [1m[31mrollback transaction[0m 23 [1m[35m (0.1ms)[0m [1m[36mbegin transaction[0m 24 [1m[35m (0.1ms)[0m [1m[31mrollback transaction[0m 25
###試したこと
エラーコードの
expected to find text
の箇所から、見つかったテキストがトップページのものなのでページ遷移に失敗している
のは分かるのですが、どこを直すべきか分かりません。
また、
it "incomeの新規登録" do #直接incomes#createのパスを送る visit incomes_path expect(page).to have_content 'Create Income' click_button 'Create Income' #income/newページをrender visit current_path #値を全て入力してCreate Incomeボタンを押す
上のようにvisitで直接createアクションのパスを送ったところ、
以下のようなエラーが起きました。
# Capybara::ExpectationNotMet: # expected to find text "Create Income" in "ホーム\n収入を記録\n支出を記録\n収入を確認\n支出を確認\nカテゴリを選択してください\n給与\n配当\nおこづかい\nその他" # ./spec/system/incomes_spec.rb:14:in `block (2 levels) in <top (required)>'
create incomeボタン以外のテキストは見つかっているようなので、
form_forとbootstrapを使ってボタンを書いた事が原因で
テキストが見つけられていないのかと思っています
###コード
収入を記録ボタンのコード
Header
1<header> 2<nav class="navbar navbar-expand-md navbar-light bg-light conteiner"> 3 <button type="button" class="navbar-toggler" data-toggle="collapse" data-target="#bs-navi" aria-controls="bs-navi" aria-expanded="false" aria-label="Toggle navigation"> 4 <span class="navbar-toggler-icon"></span> 5 </button> 6 7 <div class="collapse navbar-collapse row" id="bs-navi"> 8 9 <ul class="navbar-nav "> 10 <li class="nav-item col-sm-3"><%= link_to "ホーム", root_path, class:"nav-link" %></li> 11 <li class="nav-item col-sm-3"><%= link_to "収入を記録", new_income_path, class:"nav-link" %></li> 12 <li class="nav-item col-sm-3"><%= link_to "支出を記録", new_expense_path, class:"nav-link" %></li> 13 <li class="nav-item col-sm-3"><%= link_to "収入を確認", incomes_path, class:"nav-link" %></li> 14 <li class="nav-item col-sm-3"><%= link_to "支出を確認", expenses_path, class:"nav-link" %></li> 15 </ul> 16 </div> 17</nav> 18</header>
incomesコントローラーのコード
class IncomesController < ApplicationController def index @incomes = Income.all if params[:category].present? @incomes = @incomes.get_by_category params[:category] end end def show @income = Income.find(params[:id]) end def new @income = Income.new end def edit @income = Income.find(params[:id]) end def create @income = Income.new(income_params) if @income.save redirect_to action: index else flash.now[:danger] = '入力に失敗しました。全ての項目を記入してください' render 'new' end end def update @income = Income.find(params[:id]) if @income.update(income_params) flash[:success] = "編集に成功しました" redirect_to action: 'index' else render 'edit' end end def destroy @income.destroy flash[:success] = "削除に成功しました" redirect_to root_url end private def income_params params.require(:income).permit(:category, :price, :date, :memo) end end
incomes#newページのコード
NewIncomePage
1 <%= form_for(@income) do |f| %> 2 <section class = "row incomes_row"> 3 <div class="incomes_item col-sm-3"> 4 <%= f.label :カテゴリ %> 5 <%= f.select :category, [["給与", "給与"], ["配当", "配当"], ["おこづかい", "おこづかい"], ["その他", "その他"]] %> 6 </div> 7 8 <div class="incomes_item col-sm-3"> 9 <%= f.label :金額 %> 10 <%= f.text_field :price %> 11 </div> 12 13 <div class="incomes_item col-sm-3"> 14 <%= f.label :日付 %> 15 <%= f.date_select :date, {include_blank: true, use_month_numbers: true} %> 16 </div> 17 18 <div class="incomes_item col-sm-3"> 19 <%= f.label :メモ %> 20 <%= f.text_field :memo %> 21 </div> 22 </br> 23 </section> 24 <div class="actions"> 25 <%= f.submit %> 26 </div> 27<% end %>
###補足情報
rspec -v
RSpec 3.9
- rspec-core 3.9.1
- rspec-expectations 3.9.0
- rspec-mocks 3.9.1
- rspec-rails 3.9.0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/29 06:42
2020/01/29 06:50
2020/01/29 07:21
2020/01/29 07:29
2020/01/29 08:15 編集