使用Rspec 2和Devise在Rails 3中测试助手

我的帮助程序代码看起来像这样(并且工作正常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 # # ./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?存根user_signed_in? 并返回falsetrue ,我的结果应该适当改变。 这为您提供了一个干净的隔离测试。

您是否正在维护wiki中建议的测试助手?

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

在你的情况下, type可能是helper

也许试着把它放在前一块?

  @request.env["devise.mapping"] = :user 

这并没有让我满意,也许永远不会解决。 我认为现在最好的解决方法是手动helper.current_user以及您正在测试的辅助方法中使用的任何其他Devise方法。

是的,Devise为控制器和视图规范提供了这些存根工具。 我怀疑它是关于Devise / Rails / Test :: Unit / Rspec的组合,certificate了这对辅助规范很难。

我的助手测试使用Devise和cancan并且可以在没有任何存根的情况下工作(但我不确定实际存根是否更好)。

这是要点: https ://gist.github.com/shotty01/5317463我还尝试添加user_signed_in? 在辅助方法中它仍然很好。

以下是必需的:

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

我的规格gem:

 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方法来直接创建用户或从fixtures创建。