簡體   English   中英

rspec模型測試失敗

[英]rspec model test failing

我正在編寫一個應用程序,以幫助我跟蹤自己的社交媒體廣告預算。 輸入新廣告時,它應該計算並更新從中提取的預算支出。 這是我的模型實現的。

class Advert < ActiveRecord::Base
    belongs_to :budget
  before_save :update_budget
    after_destroy :update_budget

    validates :budget_id, :name, :platform, :ad_type, :amount, :start_date, :end_date, presence: true
    validates :amount, numericality: true
  validate :check_budget

      # Checks to see if there is enough budget remaining to set up advert
      def check_budget
      if self.amount > self.budget.amount_remaining
        errors.add(:amount, " cannot exceed amount remaining in budget.")
      end
    end



    # Updates the amount remaining in the budget on advert save.
    def update_budget
        budget = Budget.find(self.budget_id)
        @adverts = Advert.all
        total_spent = self.amount
        @adverts.each do |advert|
            if advert.budget_id == self.budget_id
                total_spent += advert.amount
            end
        end
        budget.amount_spent = total_spent
        budget.save
    end
end 

所有這些都有效,但是我目前正在自學編寫測試,因此我認為我會為此在rspec中編寫測試。

require 'rails_helper'

describe Advert do
    it "updates budget before save" do
        advert = create(:advert)
        budget = advert.budget

        expect(budget.amount_spent).to eq(advert.amount)
        expect(budget.amount_remaining).to eq(budget.amount - budget.amount_spent)
    end

end

但是,此測試如果失敗,但我無法弄清原因。 這是錯誤代碼。

1) Advert updates budget before save
     Failure/Error: expect(budget.amount_spent).to eq(advert.amount)

       expected: 7.0 (#<BigDecimal:7ffa61358b18,'0.7E1',9(18)>)
            got: 0.0 (#<BigDecimal:7ffa6026a9a0,'0.0',9(18)>)

       (compared using ==)
     # ./spec/models/advert_spec.rb:27:in `block (2 levels) in <top (required)>'

這是相關的測試日志。

  SQL (0.3ms)  INSERT INTO "budgets" ("name", "amount", "client_id", "amount_remaining", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5, $6) RETURNING "id"  [["name", "eos"], ["amount", "432.0"], ["client_id", 102], ["amount_remaining", "432.0"], ["created_at", "2016-03-12 18:08:54.607999"], ["updated_at", "2016-03-12 18:08:54.607999"]]
   (0.1ms)  RELEASE SAVEPOINT active_record_1
   (0.2ms)  SAVEPOINT active_record_1
  Budget Load (0.4ms)  SELECT  "budgets".* FROM "budgets" WHERE "budgets"."id" = $1 LIMIT 1  [["id", 49]]
  Advert Load (0.5ms)  SELECT "adverts".* FROM "adverts"
  SQL (0.4ms)  UPDATE "budgets" SET "amount_spent" = $1, "amount_remaining" = $2, "updated_at" = $3 WHERE "budgets"."id" = $4  [["amount_spent", "7.0"], ["amount_remaining", "425.0"], ["updated_at", "2016-03-12 18:08:54.616491"], ["id", 49]]
  SQL (0.4ms)  INSERT INTO "adverts" ("budget_id", "name", "platform", "ad_type", "amount", "start_date", "end_date", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) RETURNING "id"  [["budget_id", 49], ["name", "ut"], ["platform", "voluptate"], ["ad_type", "facere"], ["amount", "7.0"], ["start_date", "2016-03-01"], ["end_date", "2016-04-12"], ["created_at", "2016-03-12 18:08:54.619698"], ["updated_at", "2016-03-12 18:08:54.619698"]]
   (0.2ms)  RELEASE SAVEPOINT active_record_1
   (0.2ms)  ROLLBACK

有趣的是,如果我注釋掉第一個“期望”,則測試通過。 好像它無法訪問advert.amount,因此將其設置為0。

有人有想法么?

這解決了我的問題。

describe Advert do
    it "updates budget before save" do
        advert = build(:advert)
        budget = advert.budget

        expect(budget.amount_spent).to eq(0)

        advert.save
        budget.reload

        expect(budget.amount_spent).to eq(advert.amount)
        expect(budget.amount_remaining).to eq(budget.amount - budget.amount_spent)
end

我認為問題的根源不是重新加載預算,這意味着我試圖在更新屬性之前嘗試訪問該屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM