2017-01-03 21 views
0

Ich implementiere Punkt-System. Und wenn der Benutzer erstellt, hat der Benutzer einige Punkte. Meine registrations_controller_spec.rb ist unten.Rspec Fehler in Registrierungen Aktion des Gerätes

  require 'rails_helper' 
     RSpec.describe Users::RegistrationsController, type: :controller do 
      describe 'sign in' do 
      before do 
       @user=build(:user) 
       @request.env["devise.mapping"] = Devise.mappings[:user] 
      end 
      it 'adds 60 point with default' do 
       post :create , params: {name: @user.name , sex: @user.sex , age: @user.age ,country: @user.country ,email: @user.email ,password: @user.password, password_confirmation: @user.password , confirmed_at: DateTime.now } 
      expect(response).to render_template root_path 
      expect(@user.points).to eq (60) 
      end 
     end 
     end 

und My registrations_controller.rb ist unten.

und es ist benutzerdefinierte Controller, so dass meine config/routes.rb ist unten.

   Rails.application.routes.draw do 
       devise_for :users, controllers: { 
        registrations: 'users/registrations' , 
       } 
       end 

Ich habe den Fehler unten.

  expected: 60 
      got: 0 

Kurz gesagt, denke ich, dass ich nicht vom Benutzer erstellen konnte, weil ich den Fehler unten, wenn ich geändert hatte ‚erwarten (@ user.points) .to eq (60)‘ zu ‚erwarten (@user. reload.points) .to eq (60) '.

 Couldn't find User without an ID 

Warum habe ich den Fehler? Bitte hilf mir. Wie auch immer, Benutzer Modell Datei ist unten.

 class User < ActiveRecord::Base 
     devise :database_authenticatable, :registerable, 
      :recoverable, :rememberable, :trackable, :validatable, :confirmable, :timeoutable, :omniauthable, :omniauth_providers => [:facebook] 

      default_scope -> {order(created_at: :desc)} 

      validates :name , presence: true , length: {maximum: 18} 
      validates :sex , presence: true 
      validates :age , presence: true 
      validates :country , presence: true 

      def points(force_reload = false) 
      self.rewards(force_reload).sum(:point) 
      end 
     end 

und My Application ist unter (verwendeten ersinnen starke Parameter in der Datei)

  class ApplicationController < ActionController::Base 
      protect_from_forgery with: :exception 
      before_filter :configure_permitted_parameters, if: :devise_controller? 

      def after_sign_in_path_for(resource) 
       if (session[:previous_url] == user_path(resource)) 
        user_path(resource) 
       else 
        session[:previous_url] || user_path(resource) 
       end 
      end 


      protected 
       def configure_permitted_parameters 
        devise_parameter_sanitizer.permit(:sign_up, keys: [:name,:age,:sex,:skill,:content, :picture , :country , :language1, :language2 ]) 
        devise_parameter_sanitizer.permit(:account_update, keys: [:name,:age,:sex,:skill,:content, :picture , :country , :language1, :language2 ]) 
      end 
      end 

Mein test.log unten.

 Processing by Users::RegistrationsController#create as HTML 
     Parameters: {"params"=>{"email"=>"[email protected]", "name"=>"Shiruba", "sex"=>"男性", "age"=>"10代", "country"=>"Japan", "language1"=>"Japanese", "language2"=>"Korea", "content"=>"heyheyheyeheyeheye", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "confirmed_at"=>"2017-01-04T02:33:47+00:00"}} 
     [1m[35m (0.1ms)[0m SAVEPOINT active_record_1 
     [1m[36m (0.1ms)[0m [1mROLLBACK TO SAVEPOINT active_record_1[0m 
     Rendered devise/registrations/new.html.erb within layouts/application (0.3ms) 
     Completed 200 OK in 937ms (Views: 13.5ms | ActiveRecord: 0.7ms) 

und meine Fabrik ist unten.

 FactoryGirl.define do 
     factory :user do 
     sequence :email do |n| 
     "shiruba#{n}@docomo.ne.jp" 
     end 
     name "Shiruba" 
     sex "男性" 
     age "10代" 
     country 'Japan' 
     content 'heyheyheyeheyeheye' 
     password "shibaa" 
     password_confirmation "shibaa" 
     confirmed_at { DateTime.now } #ブロックに入れることでこれを実行したときのnowになる。 
      end 
     end 
+0

Können Sie 'expect (User.ast.points) .to eq (60)' anstelle von 'expect (@ user.points) .to eq (60)' versuchen? Ihr '@ user' wurde noch nicht gespeichert, deshalb erhalten Sie' Konnte Benutzer ohne ID nicht finden' (aber Sie haben einen anderen Benutzer gespeichert, den Sie die Werte basierend auf '@ user' setzen) – amree

Antwort

1

sollten Sie rufen Super mit einem Block statt:

class Users::RegistrationsController < Devise::RegistrationsController 
    def create 
    # almost all the devise controller actions 
    # yield the user being created or modified 
    super do |resource| 
     resource.rewards.new(point: 60) 
    end 
    # the user is saved as usual in the super class method 
    # this also causes associated records to be saved if it is valid. 
    end 
end 

Auch sind Sie vollständig FactoryGirl.build und die Variable @user mißbrauchen. .build erstellt eine Modellinstanz und täuscht Persistenz vor. So in dieser Zeile:

expect(@user.points).to eq (60) 

erwarten Sie nur, dass die gefälschten Benutzer, den Sie in zu @user in der Spec 60 Punkte haben zugewiesen haben. Es wird Ihnen nicht sagen, ob Ihr Controller funktioniert.

require 'rails_helper' 
RSpec.describe Users::RegistrationsController, type: :controller do 
    describe "POST #create" do 
    # Using 'let' and not @ivars is preferred in rspec. 
    let(:valid_attributes) { FactoryGirl.attributes_for(:user, confirmed_at: Time.now) } 

    it "creates a new user" do 
     expect do 
     post :create, params: valid_attributes 
     end.to change(User, :count).by(+1) 
    end 

    it "gives the user 60 points for signing up" do 
     post :create, params: valid_attributes 
     expect(User.find_by_email(valid_attributes[:email]).points).to eq 60 
    end 
    end 
end 
+0

Vielen Dank für Ihren höflichen Kommentar !! Ich sehe, aber es funktioniert nicht ... Ich habe den gleichen Fehler von 'erwarteten # count um 1 geändert haben, wurde aber geändert durch 0' und 'undefined Methode 'Punkte' für nil: NilClass '. Ich dachte, dass es von starken Parametern verursacht, (also habe ich application_controller.rb in meine Frage hinzugefügt), aber ich dachte, dass es keinen falschen Code hat. Es tut uns leid. –

+0

Das bedeutet, dass der Datensatz nicht im Controller gespeichert wird. Überprüfen Sie 'logs/test.log', um festzustellen, was fehlschlägt, und stellen Sie sicher, dass Ihre Factory gültige Attribute generiert. – max

+0

Ich denke, Fabrik erzeugt gültige Attribute. und ich überprüfe Protokolle/test.log und die Datei zeigt, dass der Test erfolgreich ist. Ich füge die Datei in meiner Frage hinzu. Das ist sehr mysteriös ... Es tut mir so leid für meine vielen Fragen .. –

Verwandte Themen