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

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

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

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

Ruby on Rails

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

Q&A

1回答

2065閲覧

System Spec click_onでリンクを押したはずがページ遷移に失敗する

ketyan

総合スコア22

RSpec

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/01/29 06:15

編集2020/01/29 07:16

現在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  (0.2ms) SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC 2  (0.1ms) begin transaction 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  (0.3ms) SELECT SUM("incomes"."price") FROM "incomes" WHERE "incomes"."date" BETWEEN ? AND ? [["date", "2020-01-01"], ["date", "2020-01-31"]] 7 Income Load (0.2ms) SELECT "incomes".* FROM "incomes" WHERE "incomes"."date" BETWEEN ? AND ? ORDER BY "incomes"."date" DESC [["date", "2020-01-01"], ["date", "2020-01-31"]] 8  (0.2ms) SELECT SUM("expenses"."price") FROM "expenses" WHERE "expenses"."date" BETWEEN ? AND ? [["date", "2020-01-01"], ["date", "2020-01-31"]] 9 Expense Load (0.2ms) SELECT "expenses".* FROM "expenses" WHERE "expenses"."date" BETWEEN ? AND ? ORDER BY "expenses"."date" DESC [["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  (0.1ms) rollback transaction 21  (0.1ms) begin transaction 22  (0.1ms) rollback transaction 23  (0.1ms) begin transaction 24  (0.1ms) rollback transaction 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

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

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

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

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

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

guest

回答1

0

RequestSpecではなくSystemSpecですよね?
全く別物なので混乱してしまいました。

テストの内容も省略されており、それに関するファイルの情報もないため何もわかりませんが
まずは、実際にテストに書いてあることを手で動かしてみて、期待通りになるかを確認してみてはどうでしょうか?

rb

expect(page).to have_content 'Create Income'

の時点でトップページを表示しているようなので、

rb

click_on '収入を記録'

の動作が期待通りではないのかもしれません。

投稿2020/01/29 06:25

Mugheart

総合スコア2342

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

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

ketyan

2020/01/29 06:42

ご回答有り難うございます。 まずはタイトルの訂正とテストコードの追記をさせていただきました。 原因の特定のために足りていないコードはありますでしょうか。 サーバーを起動して実際に試すと期待通りの動作をするのですが、 テスト上では失敗しています。 'create income'や'収入を記録'などはコードからコピペしているので 写し間違いはないと考えており、原因が分かりません。
Mugheart

2020/01/29 06:50

とりあえずは、controllerファイルですかね。 あと、一応確認ですけど、ログインの機能の実装等はないですか? 例えば、ログインしてないとトップページにリダイレクトされる...とか。
ketyan

2020/01/29 07:21

ファイルを追記させていただきました。 はい、ログイン機能はつけておりません。 visitでincome_pathを送ったところ、 newページに含まれる、'create income'以外のテキストデータは 確認できました。 ボタンをform_forとbootstrapで作ったことに原因があるのでしょうか。
Mugheart

2020/01/29 07:29

うーん、ちょっとわからないですね...。 ログを見た感じ "ホーム\n収入を記録\n支出を記録\n収入を確認\n支出を確認 ..." のテキストはヘッダーであって、トップページでなくても表示されそうに見えるんですが、どうでしょうか。 現在の画面が確実にトップページである、というのであれば正直お手上げなんですが、トップページだと思っていたけど実はちゃんと new ページを表示していた、のであれば解決の糸口がありそうです。 ボタンの存在確認を have_content で行ったことがない (click_buttonでクリックできたかどうかで存在確認となり得る) ので、もしかすると have_content でボタンを検知できていないのかもしれません(未検証)。 どんな画面が表示されているのか、どんなテキストが画面上にあるのか、は save_and_open_page や take_screenshot を仕込んでページを表示させてみたりスクリーンショットを保存してみるとわかりやすいかと思います。
ketyan

2020/01/29 08:15 編集

ご回答有り難うございます。 テスト結果はスクリーンショットで確認していますが、全てトップページでした… 動作自体は問題がないので、もう少し調べてダメなら次に進もうと思います。 お時間を割いていただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問