web-dev-qa-db-fra.com

Tous Ruby tests augmentant: méthode non définie `authentifier 'pour nil: NilClass

La plupart de mes tests soulèvent ce qui suit et je ne comprends pas pourquoi. Toutes les méthodes appellent déclencher l'erreur "authentifier". J'ai vérifié le code s'il y avait une méthode appelée "authentifier" mais il n'y a pas une telle méthode.

  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)>'

Le projet peut être trouvé là-bas => https://github.com/agilepandas/enki au cas où vous voudriez exécuter les tests vous-même.

129
Jeffrey W.

@MatthewClosson a répondu à cette question sur Twitter

@jeffehh Vous devez créer un fichier spec/support/devise.rb comme spécifié ici https://github.com/plataformatec/devise#test-helpers pour inclure les aides de test de devise #Ruby

Encore merci.

190
Jeffrey W.

Je sais que vous utilisez Rspec mais vous pouvez rencontrer ce même problème avec Test::Unit. Il vous suffit d'ajouter les assistants de test de devise à test/test_helper.rb

class ActiveSupport::TestCase
  include Devise::TestHelpers
end
72
Tim Fletcher

dans RSpec

comme Jeffrey W. l'a mentionné, dans son réponse ci-dessus -> pour régler cela à tous les contrôleurs:

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

cependant, si cela ne concerne qu'une seule spécification, vous n'avez pas nécessairement besoin d'inclure des assistants de conception dans toutes les spécifications de vos contrôleurs, vous pouvez simplement inclure explicitement ces assistants dans ce bloc de description d'un contrôleur:

require 'spec_helper'
describe MyCoolController
  include Devise::TestHelpers

  it { } 
end
7
equivalent8

La réponse ci-dessus n'a pas fonctionné pour moi (RSpec 3.1)

Voir https://stackoverflow.com/a/21166482/116174 pour une solution qui a fonctionné pour moi.

Vous devrez vous déconnecter d'un utilisateur anonyme avant de configurer des variables:

before :each do
  sign_out :user
end
7
Jonathan Lin

J'ai connu les mêmes échecs dans l'un de mes projets. Il utilise Ruby 2.0.0-p598, Rails 3.2.21, RSpec 2.99. Lorsque j'ai exécuté toutes les spécifications ensemble, le problème s'est produit. Lorsque j'ai exécuté le spécifications individuellement, ils ont passé. J'ai les éléments suivants inclus dans mon spec/spec_helper.rb:

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

J'ai ajouté ce qui suit à la première description de chaque fichier de spécifications défaillant. Cela n'a pas résolu le problème:

before :each do
  sign_out :user
end

Pas plus:

after :each do
  sign_out :user
end

En m'inspirant de la réponse à this stackoverflow question, j'ai exécuté différentes combinaisons de répertoires rspec ensemble pour découvrir lesquels pourraient interférer les uns avec les autres. Finalement, j'ai découvert que j'appelais:

before() do #note no :each passed to before
  :
end

quand j'ai changé toutes les occurrences de ceci en:

before(:each) do
  :
end

Toutes les spécifications ont réussi sans l'échec:

undefined method `authenticate' for nil:NilClass

J'espère que cela aide les autres.

1
Cathal Curtis

Si vous travaillez avec des spécifications de vue, vous pouvez créer un talon de current_user. Cela remplace effectivement le current_user helper appelé depuis votre vue avec tout ce qui est retourné. Voici comment utiliser 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
0
Pete