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