Тестирование помощников в Rails 3 с Rspec 2 и Devise - PullRequest
14 голосов
/ 12 января 2011

Мой вспомогательный код выглядит следующим образом (и, между прочим, работает нормально):

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'

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

Ответы [ 5 ]

12 голосов
/ 22 мая 2011

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

1 голос
/ 12 января 2011

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

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

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

0 голосов
/ 08 апреля 2013

мой вспомогательный тест использует 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 методы для создания пользователя напрямую или из осветителей.

0 голосов
/ 05 января 2013

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

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

0 голосов
/ 21 мая 2011

Может быть, попробовать поставить это в блоке before?

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