[Ruby-On-Rails] Tutti i test di Ruby che si sollevano: metodo non definito 'authenticate' per nil: NilClass


Answers

Sono consapevole che stai usando Rspec ma puoi eseguire lo stesso problema con Test::Unit . Hai solo bisogno di aggiungere gli helper test/test_helper.rb per test/test_helper.rb

class ActiveSupport::TestCase
  include Devise::TestHelpers
end
Question

La maggior parte dei miei test sta sollevando quanto segue e non capisco perché. Tutti i metodi richiamano l'errore "autenticarsi". Ho controllato il codice se c'era un metodo chiamato "autenticarsi" ma non esiste un tale metodo.

  1) Admin::CommentsController handling GET to index is successful
     Failure/Error: get :index
     undefined method `authenticate!' for nil:NilClass
     # ./spec/controllers/admin/comments_controller_spec.rb:9:in `block (3 levels) in <top (required)>'


  124) PostsController handling GET for a single post should render show template
     Failure/Error: get :show, :year => '2008', :month => '01', :day => '01', :slug => 'a-post'
     undefined method `authenticate' for nil:NilClass
     # ./app/controllers/application_controller.rb:18:in `set_current_user_for_model'
     # ./spec/controllers/posts_controller_spec.rb:131:in `do_get'
     # ./spec/controllers/posts_controller_spec.rb:140:in `block (3 levels) in <top (required)>'

Il progetto può essere trovato là => https://github.com/agilepandas/enki nel caso in cui ti piacerebbe eseguire i test da soli.




Se stai lavorando con le specifiche di visualizzazione, puoi eseguire lo stub di current_user . Questo sostituisce in modo efficace l'helper current_user chiamato dalla tua vista con qualunque cosa viene restituita. Ecco come con rspec-3.2.3:

RSpec.describe "projects/show", type: :view do
  before(:each) do
    allow(view).to receive(:current_user).and_return(FactoryGirl.create(:user))
  end

  it "renders attributes in <p>" do
    render
    expect(rendered).to match(/whatever you want to regex match here/)
  end
end



in RSpec

come ha detto Jeffrey W., nella sua risposta di cui sopra -> per impostare questo a tutti i controllori:

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

tuttavia, se questo è rilevante per una sola specifica, non è necessario includere gli helper di sviluppo per tutte le specifiche del controller, è possibile includere in modo esplicito quegli helper in quel blocco descrittivo del controller:

require 'spec_helper'
describe MyCoolController
  include Devise::TestHelpers

  it { } 
end



Ruby ti sta dicendo che il metodo #authenticate non è stato ancora annullato su nil . Puoi farlo facilmente:

def nil.authenticate!
  puts "Bingo! Nil is now authentic!"
end

E l'errore andrà via.




Links