2016-12-26 38 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 

和我的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 

和我的模型/ 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實例與數據庫不同步。

+0

謝謝您發表評論我試過了,但它不工作... –

0

首先,您是否使用自定義控制器(儘管繼承自設計會話控制器)來配置路由?

這樣的事情,但在你的情況下,它的會話,而不是註冊的:

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文件,並在這個問題中展示了它。但它不起作用。我有同樣的錯誤... –