2016-12-26 3 views
0

ポイントシステムを実装しました。ユーザーがログインしたときにUser.pointが2増加します。 私の開発したセッションコントローラは以下の通りです。デバイスセッションでのRspecテストエラー#create

 class Users::SessionsController < Devise::SessionsController 
      after_action :add_point, only: [:create] 
      # POST /resource/sign_in 
      def create 
       super 
      end 
      private 

      def add_point 
       resource.rewards.create(point: 2) 
     end 

     end 

およびMy spec/controllers/users_controller_spec.rbは以下のとおりです。

RSpec.describe UsersController, type: :controller do 
describe 'adds 2 point with login' do 
    before do 
     @user=create(:user) 
    end 
    it 'adds 2 point in one day if two times login' do 
    expect{login_user(@user)}.to change {@user.points}.by(0) 
    end 
    it 'adds 4 point in two day ' do 
    expect{login_user(@user)}.to change {@user.points}.by(2) 
    end 
end 
end 

とmy model/user.rbは以下のとおりです。

 class User < ActiveRecord::Base 
      def points 
       self.rewards.sum(:point) 
      end 
     end 

私がrspecコマンドを実行したとき、私はこのエラーが発生しました。

Failure/Error: expect{login_user(@user)}.to change {@user.points}.by(2) 
    expected result to have changed by 2, but was changed by 0 

@ user.pointsがrails/consoleで2増加したことを確認しました。 このエラーはなぜ発生しますか?教えてください。

回答を見ると、以下のように変更されます。動作するほとんどのケースで

 require 'rails_helper' 

     RSpec.describe Users::SessionsController, type: :controller do 
     describe 'adds 2 point with login' do 
     before do 
      @user=create(:user) 
      @request.env["devise.mapping"] = Devise.mappings[:user] 
     end 
     it 'adds 2 point in one day if two times login' do 
     expect{post :create, params: {email: @user.email ,password: @user.password} }.to change {@user.points(true)}.by(0) 
    end 
     it 'adds 4 point in two day ' do 
      expect{post :create, params: {email: @user.email ,password: @user.password} }.to change {@user.points(true)}.by(2) 
     end 
    end 
    end 

答えて

0

expect{ login_user(@user) }.to change { @user.reload.points }.by(0) 

@userインスタンスがDBで非同期化されているように見えます。

+0

コメントありがとうございました –

0

まず、カスタムコントローラを使用しているので、ルーティングを設定しました(ただし、Deviseセッションコントローラから継承しています)。

このようなものに、しかし、あなたの場合には、それはセッションの代わりの登録です:

devise_for :users, :controllers => { :registrations => "registrations" } 

出典: https://howilearnedrails.wordpress.com/2013/12/27/how-to-override-and-customize-the-devise-controller-in-rails/comment-page-1/

第二に、あなたは基本的にカスタムコントローラを使用しているため、コントローラにノーマルを打ってみてくださいDeviseテストヘルパーを使用するのではなく、 は、ここで以下のような工夫のドキュメントからlogin_user方法を得たと仮定:

module ControllerMacros 
    def login_user 
    before(:each) do 
     @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 
end 

あなたはLOGIN_USERの方法は、あなたが作成したユーザー:: SessionsControllerへの要求をしないことを理解する必要があります。このため、コールバックafter_action :add_point, only: [:create]がトリガーされないため、logged_inユーザーにポイントが追加されませんでした。

私は適切な要求とRSpecのを押すことで、意味は次のように呼んでいる!

post :create, params: { session_params } 
+0

コメントありがとうございました...私はそれを試してみましたが、それは動作しません。 !私はspecファイルを変更し、この質問にそれを示しました。それは動作しません。私は同じエラーがあります... –

関連する問題