Тестирование помощников в Rails 3 с помощью Rspec 2 и Devise

Мой код помощника выглядит так (и отлично работает):

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) (и другие) к вашим тестам. Они не добавляют помощников, которые вы бы использовали в своем коде контроллера/просмотра.

Ответы

Ответ 1

Я думаю, что философия rspec заключается в том, чтобы как можно больше протестировать представление/помощники/модели в полной изоляции. Поэтому в этом случае я бы отключил user_signed_in? и вернул false или true, и мои результаты должны измениться соответствующим образом. Это дает вам чистое изолированное испытание.

Ответ 2

В настоящее время вы включаете тестовых помощников, как предлагается в wiki?

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

type будет, вероятно, helper в вашем случае.

Ответ 3

Может быть, попробуйте поместить это в блок раньше?

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

Ответ 4

Это не удалось удовлетворить моему удовлетворению и, вероятно, никогда не будет. Я думаю, что на сегодняшний день лучше всего работать с заглушкой helper.current_user и любыми другими методами Devise, которые вы используете в методе помощника, который вы тестируете.

Да, Devise предоставляет эти устройства для настройки контроллера и просмотра. Я подозреваю, что это что-то вроде комбинации Devise/Rails/Test:: Unit/Rspec, что доказывает, что это сложно для вспомогательных спецификаций.

Ответ 5

my helper test использует 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)

конечно, вы можете войти без девушки factory, вам просто нужно переписать методы ValidUserHelper для создания пользователя напрямую или из светильников.