简体   繁体   中英

rspec model test failing

I am writing an app to help me keep track of my social media advertising budgets. When you enter a new advert it should calculate and update the amount spent on the budget it is drawing from. Here is my model that achieves that.

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 

This all works but I am currently teaching myself to write tests so I thought I would write a test in rspec for it.

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

However, this test if failing but I cannot figure out why. Here is the error code.

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)>'

And here is the relevant test log.

  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

Interestingly if I comment out the first 'expect' the test passes. It's as though it cannot access advert.amount so set's it as 0.

Anyone have any ideas?

This solved my issue.

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

I think the source of my problem was not reloading my budget which meant that I was trying to access the attribute before it had been updated.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM