2017-01-04 6 views
0

J'essaie de tester un contrôleur authentifié avec RSpec et OmniAuth. J'ai suivi le guide integration testing sur leur wiki. Quand je lance le test, je reçois l'erreur suivante:méthode non définie `provider 'pour nil: NilClass, RSpec, OmniAuth

Failure/Error: 
     where(provider: auth.provider, uid: auth.uid).first_or_initialize.tap do |user| 
     user.provider = auth.provider 
     user.uid = auth.uid 
     user.first_name = auth.info.first_name 
     user.last_name = auth.info.last_name 
     user.email = auth.info.email 
     user.picture = auth.info.image 
     user.save! 
     end 

    NoMethodError: 
     undefined method `provider' for nil:NilClass 

Tout le code correspondant est fourni dans ce gist. Mon intuition est que le simulacre d'authentification n'est pas défini d'une manière ou d'une autre mais je n'ai aucun moyen de le vérifier. Je configure OmniAuth dans config/environments/test.rb comme indiqué dans le Gist, et je suis assez sûr que le fichier est exécuté lorsque l'application démarre.

Répondre

1

Il y a quelques problèmes que je vois. Pour commencer, vous ne testez pas l'action de connexion. Vous frappez une action du contrôleur avec des données oauth dans la requête et attendez qu'elle passe l'authentification. Les données Oauth ne sont pas comme une clé API et ne vous laisseront pas vous connecter automatiquement comme ça. Vous devez appuyer sur l'action de connexion spécifique fournie par omniauth qui configure ensuite la session de votre utilisateur. Cela devrait être testé seul pour confirmer que votre stratégie de connexion oauth fonctionne comme prévu. Si vous testez des actions de contrôleur qui ne sont pas directement liées à l'action des connexions oauth, vous devez utiliser the devise test helpers pour vous connecter aux utilisateurs avant d'exécuter des tests nécessitant une authentification.

En outre, vous ne souhaitez pas définir la configuration OmniAuth dans un initialiseur d'environnement. La documentation suggère, et ce que je fais moi-même, est de configurer la configuration dans les tests. D'une part, cela vous permet de tester différents types de scénarios. Par exemple, voici comment je teste que mes contrôleurs de rappel omniauth travaillent et faire ce que je veux:

context 'with valid google credentials' do 
    # this should actually be created in a factory 
    let(:provider) { :google_oauth2 } 
    let(:oauth) { OmniAuth::AuthHash.new provider: provider, uid: '1234' } 
    before do 
    OmniAuth.config.test_mode = true 
    OmniAuth.config.mock_auth[provider] = oauth 
    end 

    it 'creates a new user' do 
    expect { visit "https://stackoverflow.com/users/auth/#{provider}" }.to change(User, :count).by(1) 
    end 
end 
+0

Merci pour la réponse, je le tester. Je reçois une erreur de méthode 'visit' non définie. Je n'ai que 'require 'rails_helper'' et la gemme' rspec-rails' est installée – Carpetfizz

+0

Juste installé 'capybara' car il semble définir la méthode' visit', mais je reçois toujours l'erreur. – Carpetfizz

+1

Avez-vous ajouté 'require 'capybara/rails'' à votre rails_helper.rb'? – mroach