tutorial signup sign_in rails method instalar generate ruby-on-rails-4 rspec devise

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 ...