ruby on rails 4 - signup - Rails, Devise, Rspec: Método indefinido ''sign_in''
instalar devise rails (5)
¿Actualizaste recientemente a RSpec 3 como yo? Esto es de la documentación de RSpec 3 :
Adición automática de metadatos Las versiones de RSpec anteriores a 3.0.0 agregaron automáticamente metadatos a las especificaciones en función de su ubicación en el sistema de archivos. Esto era confuso para los usuarios nuevos y no deseable para algunos usuarios veteranos.
En RSpec 3, este comportamiento debe estar explícitamente habilitado:
# spec/rails_helper.rb RSpec.configure do |config| config.infer_spec_type_from_file_location! end
Como este comportamiento asumido es tan frecuente en los tutoriales, la configuración predeterminada generada por los rieles genera rspec: install habilita esto.
Si sigue la estructura de directorios canónicos enumerada anteriormente y ha configurado infer_spec_type_from_file_location !, RSpec incluirá automáticamente las funciones de soporte correctas para cada tipo.
Después de agregar ese fragmento de configuración, ya no tengo que especificar el tipo de especificación (por ejemplo, type: :controller
).
Intento escribir pruebas de Rspec en Rails, utilizando los métodos de ayuda de Devise para iniciar y cerrar sesión. El método sign_in no funciona. Sin embargo, había estado trabajando antes, antes de una serie de cambios en la aplicación.
Cosas que he intentado:
- Incluyo los ayudantes de prueba en Rspec.configure.
- Usando los login_as de Warden
- Limpiando el caché de Rails.
- Deshacerse de Capybara para ver si eso causaba el problema
- No estoy configurando la sesión de forma explícita en las especificaciones de mi controlador (por ejemplo, no valid_session)
Hasta ahora, no hay dados. ¿Qué debo hacer de manera diferente para probar mis controladores con un usuario registrado?
Mensaje de error:
OrderItemsController GET #index renders the :index view
Failure/Error: sign_in :admin
NoMethodError:
undefined method `sign_in'' for # <RSpec::ExampleGroups::OrderItemsController_2::GETIndex:0x00000102c002d0>
# ./spec/controllers/order_items_controller_spec.rb:6:in `block (2 levels) in <top (required)>''
Controlador Spec
require ''spec_helper''
describe OrderItemsController do
before (:each) do
admin = create(:admin)
sign_in :admin
end
describe "GET #index" do
it "renders the :index view" do
get :index
expect( response ).to render_template :index
end
end
end
spec_helper.rb
require ''rspec/rails''
require ''capybara/rspec''
RSpec.configure do |config|
config.include ApplicationHelper
config.include ControllersHelper
config.include UsersHelper
config.include Devise::TestHelpers, type: :controller
config.include FactoryGirl::Syntax::Methods
end
Gemfile
group :development, :test do
gem ''rspec-rails'', ''~> 3.0.0.beta''
gem ''capybara''
gem ''factory_girl_rails''
gem ''faker''
gem ''dotenv-rails''
gem ''guard''
gem ''guard-annotate''
gem ''guard-rspec'', require: false
gem ''guard-livereload'', require: false
gem ''foreman''
end
fábricas / usuario.rb
FactoryGirl.define do
factory :user do
first { Faker::Name.first_name }
last { Faker::Name.last_name }
email { Faker::Internet.email }
admin false
password "secrets1"
password_confirmation "secrets1"
confirmed_at Date.today
factory :admin do
admin true
end
end
end
Gracias por adelantado.
Descubrí una solución. Definí explícitamente el bloque Describir del controlador como un tipo de controlador.
describe OrderItemsController, :type => :controller do
Todavía no entiendo por qué este código funcionó antes, pero ahora necesita esta declaración explícita (aparentemente redundante). De todos modos, agradecería saber lo que sucedió aquí. ¡Gracias!
Para Rails 5 y Rspec 3 necesita agregar esto en su spec_helper.rb
config.include Devise :: Test :: ControllerHelpers, tipo:: controller
Puede usar el Ayudante de Devise en el archivo spec / spec_helper.rb:
RSpec.configure do |config|
config.include Devise::TestHelpers, type: :controller
end
Puedo darte un ejemplo (funciona para mí - rspec / capybara / simplecov, etc.)
spec / spec_helper.rb
require ''capybara/rspec''
require ''capybara/rails''
RSpec.configure do |config|
config.use_transactional_fixtures = true
config.infer_base_class_for_anonymous_controllers = false
config.include FactoryGirl::Syntax::Methods
config.include Devise::TestHelpers, type: :controller
config.include Capybara::DSL
config.include Warden::Test::Helpers
config.include Rails.application.routes.url_helpers
end
spec / integration / user_flow_spec.rb
require ''spec_helper''
feature ''Verify contract'' do
# Create employee
let(:employee) { create(:employee) }
let (:book) { create(:book) }
# Sign in employee before each test!
before :each do
login_as employee, scope: :user
end
scenario ''create book'' do
# Visit Index and click to create
visit employee_books_path
click_link ''Create''
expect(current_path).to eq(employee_books_path)
end
end
Espero que todo salga bien :) Creo que su problema no tiene asistentes de prueba de Warden ...