首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rspec失败: Coupon.increment_counter未递增记录值

Rspec失败: Coupon.increment_counter未递增记录值
EN

Stack Overflow用户
提问于 2019-11-03 03:40:00
回答 1查看 101关注 0票数 0

为什么这会失败呢?如何更正rspec测试或我的代码?

模型

代码语言:javascript
复制
class Coupon < ApplicationRecord
  def redeem!
    Coupon.increment_counter(:times_redeemed, self.id)
  end
end

Rspec

代码语言:javascript
复制
require "rails_helper"

RSpec.describe Coupon, type: :model do
  let(:coupon) { create(:coupon) }
  describe "#redeem!" do
    it "should increment redeemed count and return it" do
      expect(coupon.times_redeemed).to eql(0)
      coupon.redeem!
      expect(coupon.times_redeemed).to eql(1)
    end
  end
end

工厂

代码语言:javascript
复制
FactoryBot.define do
  factory :coupon do
    amount_off { 50 }
    stripe_id { "" }
    duration { "once" }
    duration_in_months { 1 }
    max_redemptions { 1 }
    metadata { "" }
    name { "OFF50" }
    percent_off { "50" }
    redeem_by { "" }
    times_redeemed { 0 }
    status_valid { }
  end
end

表格

代码语言:javascript
复制
  create_table "coupons", force: :cascade do |t|
    t.string "stripe_id"
    t.integer "amount_off"
    t.string "duration"
    t.integer "duration_in_months"
    t.integer "max_redemptions"
    t.json "metadata", default: {}, null: false
    t.string "name"
    t.decimal "percent_off"
    t.datetime "redeem_by"
    t.integer "times_redeemed"
    t.boolean "status_valid", default: true
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["stripe_id"], name: "index_coupons_on_stripe_id"
  end

失败:

代码语言:javascript
复制
  1) Coupon#redeem! should increment times_redeemed by 1
     Failure/Error: expect(coupon.times_redeemed).to eql(1)

       expected: 1
            got: 0

       (compared using eql?)

当我在控制台中尝试时,它也没有更新:

代码语言:javascript
复制
2.6.3 :006 > a
 => #<Coupon id: 2, stripe_id: nil, amount_off: nil, duration: nil, duration_in_months: nil, max_redemptions: nil, metadata: {}, name: nil, percent_off: nil, redeem_by: nil, times_redeemed: 0, status_valid: true, restricted: {}, created_at: "2019-11-02 19:44:07", updated_at: "2019-11-02 19:44:07"> 
2.6.3 :007 > a.redeem!
  Coupon Update All (5.5ms)  UPDATE "coupons" SET "times_redeemed" = COALESCE("times_redeemed", 0) + 1 WHERE "coupons"."id" = $1  [["id", 2]]
 => 1 
2.6.3 :008 > a
 => #<Coupon id: 2, stripe_id: nil, amount_off: nil, duration: nil, duration_in_months: nil, max_redemptions: nil, metadata: {}, name: nil, percent_off: nil, redeem_by: nil, times_redeemed: 0, status_valid: true, restricted: {}, created_at: "2019-11-02 19:44:07", updated_at: "2019-11-02 19:44:07"> 
2.6.3 :009 > 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-03 03:52:24

当您调用Coupon.increment_counter(:times_redeemed, self.id)时,object coupon并不知道DB中所做的更改,您需要重新加载它才能获取这些更改:

代码语言:javascript
复制
    it "should increment redeemed count and return it" do
      expect(coupon.times_redeemed).to eql(0)
      coupon.redeem!
      coupon.reload
      expect(coupon.times_redeemed).to eql(1)
    end
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58674662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档