неопределенный метод `sign_in' для ошибки #‹RSpec::Core::ExampleGroup::Nested_1::Nested_1:0x1057fd428› при попытке настроить RSpec с помощью Devise

У меня есть spec/controllers/add_to_carts_spec.rb:

require 'spec_helper'

describe CartItemsController do

  before (:each) do
    @user = Factory(:user)
    sign_in @user
  end

  describe "add stuff to the cart" do
    it "should add a product to the cart" do
      product = FactoryGirl.create(:product)
      visit products_path(product)
      save_and_open_page
      click_on('cart_item_submit')
    end
  end

end

и /spec/support/spec_helper.rb:

# This file is copied to spec/ when you run 'rails generate rspec:install'
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'capybara/rspec'

# Requires supporting ruby files with custom matchers and macros, etc,
# in spec/support/ and its subdirectories.
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

RSpec.configure do |config|
  config.mock_with :rspec
  config.use_transactional_fixtures = true
end

... который также загружает /spec/support/devise.rb:

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

Охранник работает в фоновом режиме и продолжает выдавать это:

Failures:

  1) CartItemsController add stuff to the cart should add a product to the cart
     Failure/Error: sign_in @user
     NoMethodError:
       undefined method `sign_in' for #<RSpec::Core::ExampleGroup::Nested_1::Nested_1:0x1057fd428>
     # ./spec/controllers/add_to_carts_spec.rb:7

Я провел последние пару часов, пробуя различные настройки конфигурации и разные синтаксисы, но, похоже, ничего не изменилось. Любые идеи?

(отредактировано, чтобы отразить более новую ошибку)


person Jordan Sitkin    schedule 21.08.2011    source источник


Ответы (3)


Эти помощники по тестированию не будут работать для спецификаций интеграции/запроса. Рекомендуемый способ протестировать Devise в таких ситуациях — посетить страницу входа, заполнить форму и отправить ее, а затем запустить тест.

См. ответ Дэвида Челимского на предыдущий вопрос SO по этой теме для более полное объяснение.

person zetetic    schedule 22.08.2011
comment
Спасибо, вы правы. Я перепутал два типа спецификаций. Я использовал капибару для посещения страниц и, таким образом, использовал его механизмы сеанса, но пытался войти в систему пользователя, как я делаю в своих спецификациях контроллера. капибара не использует и не имеет к ним доступа. - person Jordan Sitkin; 22.08.2011

Идеальным решением было бы создать файл в spec/support/devise.rb и включить помощники тестирования разработки в конфигурацию Rspec с помощью следующего кода:

Rspec.configure do |config|
  config.include Devise::TestHelpers, :type => :controller
end

Параметр type включает вспомогательные функции только в спецификации вашего контроллера, чтобы избежать будущих проблем, которые могут возникнуть из-за его вызова при тестировании моделей или представлений. Это необязательно.

Причина, по которой мы решили добавить отдельный файл для включения помощников, в отличие от включения их в спецификации, как это сделал solnic выше, заключается в том, что в случае повторной генерации спецификаций спецификация будет перезаписана.

person ziyadb    schedule 20.05.2013
comment
У этого ответа нет голосов (кроме моего собственного) и он работает очень хорошо. Не игнорируйте это как возможное решение. - person Ecnalyr; 25.06.2013
comment
Хотя это правильный способ включения этих помощников, исходный постер уже безуспешно использует этот метод. Это правильный ответ на другой вопрос. - person zznq; 14.12.2013
comment
В разделе о параметре :type этот вопрос избавил меня от головной боли. Это не очень четко задокументировано в документации Devise по тестированию. - person Matt; 27.02.2014

По какой-то причине это также не работает для меня, поэтому я просто вручную включаю этот помощник в свои спецификации следующим образом:

describe CartItemsController do
  include Devise::TestHelpers

  # ...
end
person solnic    schedule 22.08.2011