2017-01-25 3 views
0

Je n'arrive pas à comprendre comment tester l'application Rails avec le login de l'appareil.Comment tester l'application Rails avec le login de l'appareil

Le message est comme ceci.Que dois-je faire? Peut-être que je dois créer spec/model/user.rb?

$ bundle exec rspec spec/controllers/root_controller_spec.rb 
F 

Failures: 

    1) RootController GET #index returns http success 
    Got 0 failures and 2 other errors: 

    1.1) Failure/Error: @user = create(:user) 

      NoMethodError: 
      undefined method `create' for #<RSpec::ExampleGroups::RootController::GETIndex:0x007fe643b89878> 
      # ./spec/controllers/root_controller_spec.rb:6:in `block (2 levels) in <top (required)>' 

    1.2) Failure/Error: sign_out @user 

      NoMethodError: 
      undefined method `sign_out' for #<RSpec::ExampleGroups::RootController::GETIndex:0x007fe643b89878> 
      # ./spec/controllers/root_controller_spec.rb:19:in `block (2 levels) in <top (required)>' 

Finished in 0.00597 seconds (files took 3.12 seconds to load) 
1 example, 1 failure 

Failed examples: 

rspec ./spec/controllers/root_controller_spec.rb:12 # RootController GET #index returns http success 

spec/usines/users.rb

FactoryGirl.define do 
    factory :user do 
     username "Johney" 
     sequence(:email) { |n| "johney#{n}@test.com"} 
     password "password" 
    password_confirmation "password" 
    end 
end 

spec/contrôleur/root_controller_spec.rb

require 'rails_helper' 

RSpec.describe RootController, type: :controller do 

    before do 
    @user = create(:user) 

    sign_in @user 
    end 

    describe "GET #index" do 
    it "returns http success" do 
     get :index 
     expect(response).to have_http_status(:success) 
    end 
    end 

    after do 
    sign_out @user 
    end 

fin

spec_helper.rb

RSpec.configure do |config| 
    # Customize in Eiicon-Dola 
    config.include FactoryGirl::Syntax::Methods 
    config.include Devise::TestHelpers, type: :controller 
end 

Tout conseil est le bienvenu. Merci d'avance.

+0

Qu'advient-il si vous changez à '@user = FactoryGirl.create (: user)'? – max

+0

Aussi, sauf si vous travaillez sur un projet hérité, vous devez ajouter ces inclus dans 'rails_helper.rb'. La logique étant que vous pouvez exiger 'spec_helper.rb' pour les exemples qui n'ont pas besoin de toute la pile des rails. – max

+0

Merci @max. Malheureusement, la modification que vous avez mentionnée a affecté n'importe quoi. Le message d'erreur est toujours le même comme ceci. 'Échecs: 1) RootController GET #index rend l': vue d'index obtenu 0 échecs et 2 autres erreurs: 1.1) Défaut/Erreur: @user = FactoryGirl.create (: user) NoMethodError: méthode non définie 'username = 'pour # # ./spec/controllers/root_controller_spec.rb:7:in' bloc (2 niveaux) dans ' ' –

Répondre

0

Je l'ai fait login et concevoir ce code fonctionne pour moi, pourrait être un peu d'aide pour vous

Dans rails_helper.rb

require 'devise' 

Ensuite, créez un module avec une méthode de connexion auth_helper.rb

require 'spec_helper' 

module AuthHelper 
def login_user 
    @request.env["devise.mapping"] = Devise.mappings[:user] 
    user = FactoryGirl.create(:user) 
    # user.confirm # or set a confirmed_at inside the factory. Only  necessary if you are using the "confirmable" module 
    sign_in user 
end 
end 

utiliser dans le contrôleur

require 'rails_helper' 
include AuthHelper 

RSpec.describe DashboardController, type: :controller do 

before(:each) do 
    login_user 
end 

context "GET #index" do 
    it "renders the :index view" do 
    get :index 
    expect(response).to render_template("index") 
    end 
end 

end 
+0

Merci. mais il semble que ça ne marche pas pour moi. Une erreur se présente comme suit. '' ' bundler: n'a pas pu charger la commande: rspec (vendeur ***/bundle/ruby ​​/ 2.3.0/bin/rspec) NameError: constante non initialisée AuthHelper ' '' –

+0

Vous ne devriez pas avoir besoin de concevoir.'require 'rspec/rails'' dans votre helper spec ou rails va charger votre application rails qui nécessite les gemmes dans votre gemfile. Le fait d'exiger explicitement que cela peut mener à ce qu'il soit chargé dans le mauvais ordre. – max