14

私のヘルパーコードは次のようになります(そしてうまく機能します):

module ProvidersHelper
  def call_to_review(provider)
    if user_signed_in? && review = Review.find_by_provider_id_and_user_id(provider.id, current_user.id)
      link_to "Edit Your Review", edit_provider_review_path(provider, review), :class => "call_to_review"
    else
      link_to "Review This Provider", new_provider_review_path(provider), :class => "call_to_review"
    end
  end
end

残念ながら、テストを実行すると、次のエラーが発生します。

 undefined method `user_signed_in?' for #<ActionView::Base:0x00000106314640>
 # ./app/helpers/providers_helper.rb:3:in `call_to_review'

明らかに、Devise::Controllers::Helpersrspecがテストを実行しているとき、はヘルパーに含まれていません。この作業に役立つ可能性のある提案はありますか?

編集:もう少し情報を提供するために、私のspec_helperにはこれがあります:

config.include Devise::TestHelpers, :type => :controller
config.include Devise::TestHelpers, :type => :view
config.include Devise::TestHelpers, :type => :helper

(残念ながら、動作させることができませんでした:type => [:controller, :view, :helper]

とにかく、これらの行はsign_in(scope, object)(および他の)テストヘルパーをテストに追加すると思います。これらは、コントローラー/ビューコードで実際に活用するヘルパーを追加しません。

4

5 に答える 5

12

rspecの哲学は、ビュー/ヘルパー/モデルを可能な限り完全に分離してテストすることだと思います。したがって、この場合、とをスタブしてuser_signed_in?返すfalsetrue、または結果が適切に変更されるはずです。これにより、クリーンな分離テストが可能になります。

于 2011-05-21T20:34:06.653 に答える
1

現在、ウィキで提案されているテストヘルパーを含めていますか?

# spec_helper.rb:
RSpec.configure do |config|
  config.include Devise::TestHelpers, :type => :controller
end

typehelperおそらくあなたの場合でしょう。

于 2011-01-11T23:39:54.753 に答える
0

たぶんこれを前のブロックに入れてみてください?

  @request.env["devise.mapping"] = :user
于 2011-05-21T05:36:19.050 に答える
0

これは私の満足のいくように解決されておらず、おそらく決して解決されないでしょう。今のところ最善helper.current_userの回避策は、テストしているヘルパーメソッドで使用するスタブやその他のDeviseメソッドを手動で実行することだと思います。

はい、Deviseはコントローラーとビューの仕様にこれらのスタブ機能を提供します。Devise / Rails / Test :: Unit / Rspecの組み合わせが、ヘルパー仕様にとって難しいことを証明しているのではないかと思います。

于 2013-01-05T00:31:03.823 に答える
0

私のヘルパーテストはDeviseとcancanを使用しており、何もスタブせずに機能します(ただし、実際にすべてをスタブする方がよいかどうかはわかりません)。

要点は次のとおりです。https : //gist.github.com/shotty01/5317463私もuser_signed_inを追加しようとしましたか?ヘルパーメソッドで、それでも問題ありませんでした。

以下が必要です。

add to spec_helper.rb:
config.include Devise::TestHelpers, :type => :helper

私のスペックの宝石:

rspec (2.10.0)
rspec-core (2.10.1)
rspec-expectations (2.10.0)
rspec-mocks (2.10.1)
rspec-rails (2.10.1)

もちろん、ファクトリーガールなしでサインインすることもできます。ValidUserHelperメソッドを書き直して、直接またはフィクスチャからユーザーを作成する必要があります。

于 2013-04-08T08:11:07.813 に答える