我的帮助程序代码看起来像这样(并且工作正常btw):
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'
显然,当rspec运行测试时,Devise :: Controllers :: Helpers没有包含在我的助手中.任何可能有助于这项工作的建议?
编辑:提供更多的信息,我的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)(和其他)测试助手添加到您的测试中.他们不会添加您在控制器/视图代码中实际利用的帮助器.
解决方法
我认为rspec的理念是尽可能全面地测试视图/帮助者/模型.所以在这种情况下,我会存根user_signed_in?并返回false或true,我的结果应该适当地改变. 这给你一个干净的隔离测试.