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::Helpers当 rspec 运行测试时,我的助手中没有包含这些。任何可能有助于这项工作的建议?

编辑:为了提供更多信息,我的 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?并返回false,或者true我的结果应该适当地改变。这为您提供了一个干净的隔离测试。

于 2011-05-21T20:34:06.653 回答
1

您目前是否按照wiki中的建议包括测试助手?

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

type可能是helper你的情况。

于 2011-01-11T23:39:54.753 回答
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 回答
0

这还没有让我满意,而且可能永远也不会解决。我认为目前最好的解决方法是手动存根helper.current_user和在您正在测试的辅助方法中使用的任何其他设计方法。

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

于 2013-01-05T00:31:03.823 回答
0

也许尝试把它放在一个前块中?

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