【问题标题】:Rspec error in session devise with point system带有点系统的会话设计中的 Rspec 错误
【发布时间】:2016-12-31 10:02:30
【问题描述】:

我实现了积分系统。当他登录时,User.point 增加 2。我的设计会话控制器如下。

    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

我的规范/控制器/users_controller_spec.rb 如下。

   RSpec.describe UsersController, 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}.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}.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 鉴于此应用程序增加了 2。为什么我有这个错误?请告诉我。

【问题讨论】:

    标签: ruby-on-rails ruby rspec devise


    【解决方案1】:

    你需要reload用户对象来跟踪最新的变化

    我觉得这样可以跟踪点的变化

    post :create, params: {email: @user.email ,password: @user.password}
    @user.reload
    expect(@user.points).to eql 2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多