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

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

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

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

RSpec

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

Ruby on Rails

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

1回答

5030閲覧

rspec(capybara/features)の単体実行と全体実行で結果が異なる

KoukoMatsumoto

総合スコア41

Capybara

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

RSpec

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

Ruby on Rails

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

1グッド

1クリップ

投稿2016/07/19 00:45

rspec(capybara)で画面のテストを作成しております。
rspecコマンドで全体を叩いた場合と、 rpsec ファイル名 で叩いた場合、結果が異なってしまいます。
具体的には、ransackのform生成メソッドのsearch_form_forを、ApplicationHelperで上書きして用いておりますが、rspecコマンドで全体実行すると、上書きされず、メソッドが読み込まれません。
ファイル名指定をすると、URLを叩いた時と同様に、上書きされて実行されます(意図通り)

全体実行とファイル指定実行の結果が異なるのはなぜでしょうか。
情報が足りなく原因が見えません。
もしご存知の方いらっしゃいましたがご教授お願いいたします。

ruby 2.3.1
Rails 4.2.6
capistrano (3.5.0)
capybara (2.7.1)
ransack (1.7.0)
judge (2.1.1)
Server OS ubuntu

app/helpers/application_helper.rb

lang

1module ApplicationHelper 2 def search_form_for(record, options = {}, &proc) 3 options[:builder] ||= ApplicationHelper::RansackCustomFormBuilder 4 super 5 end 6end

lib/application_helper/ransack_custom_form_builder.rb

lang

1module ApplicationHelper 2 class RansackCustomFormBuilder < Judge::FormBuilder 3 include ActionView::Helpers::TagHelper 4 include ApplicationHelper 5 6 def custom_field(method, options = {}) 7 // 出力処理 8 end 9 end 10end

app/views/admin/blogs/_form.html.slim

lang

1= search_form_for [:admin, @search], html: { method: :post } do |f| 2 = f.custom_field :name # ※1 ここが全体実行だとエラーになる

※1 このエラーがrspecで出力される
ActionView::Template::Error:
undefined method `custom_field' for #Ransack::Helpers::FormBuilder

maisumakun👍を押しています

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

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

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

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

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

guest

回答1

0

自己解決

取り急ぎ自己解決しましたので書かせていただきます。
該当以外のfeatures以下のspecファイルで include ApplicationHelperをしていたのが影響していたようです。
Rspec.configの中で該当Helperをincludeするようにしたら、解決しました。
今手元にコードがないため取り急ぎ失礼します。

投稿2016/07/19 11:18

KoukoMatsumoto

総合スコア41

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

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

jnchito

2016/07/19 20:31

どうもこんにちは。こちらの件、一応解決されたとのことですが、そもそもspecファイルやRspec.config(rails_helper.rbのこと?)の中で実装コード側のモジュールをincludeしているのがちょっと変ですね。 普通は実装コード側のモジュールをincludeしなくてもテストは動くはず、というか動くようにすべきです。 libディレクトリの下にクラスを定義しているようなので、おそらくautoload_pathsの追加が必要になると思いますが、それは設定済みでしょうか?(参考: http://easyramble.com/auto-load-rails-lib.html ) とりあえず、specファイルやrails_helper.rb内で実装コード側のモジュールをincludeしている箇所があれば、一通り削除してからテストが動くようにトライしてみてください。
KoukoMatsumoto

2016/07/20 01:52

伊藤様、ありがとうございます。 モジュールをspec.rb内でincludeしている理由は、判定のためにHelper(supportの内部ではない、アプリ側のもの)を使いたい部分があるためです。 判定式は、rspecのものを独自に実装して使い回すのがrspecの考えの基本になるのでしょうか。 autoloadパスは指定しているため、そちらは問題ございません。
jnchito

2016/07/20 03:38

実際のテストコードを見ていないので断言はできませんが、「判定のためにアプリ側のHelperを使いたい」というのはアンチパターンの臭いがしますね。 以前Qiitaに書いたこちらの記事がそれに近いかもしれません。 http://qiita.com/jnchito/items/eb3cfa9f7db752dcb796 > 判定式は、rspecのものを独自に実装して使い回すのがrspecの考えの基本になるのでしょうか。 どちらかといえばそうです。 できれば独自に実装するよりも、テストごとに期待する結果をベタ書きする方が望ましいです。 (よっぽど重複が目についてイヤになる場合は共通化しますが)
KoukoMatsumoto

2016/07/22 02:50

伊藤様、再度ありがとうございます! 生成するロジックがview側とrspec側で同じものを使うことになるので、アンチパターンに該当しそうです。 Helperを呼び出して判定は禁じ手のようですね。 記事をありがとうございます!テストについてはベタ書きが基本なのですね。 確実にやらかしてしまいました・・・。 本当にありがとうございます。一つづつ潰していきたいと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問