Testing BigDecimal and sum

Hi

I have the following test:

it "calculates the actual expenditure per month" do
      @expense = Expense.new(:name => "rent", :limit => 100.50)
      @expense.save
      @expense.transactions << Transaction.new(:t_date =>
Date.civil(2010,01,05), :description => "Payment for rent", :value =>
300)
      @expense.transactions << Transaction.new(:t_date =>
Date.civil(2010,01,10), :description => "Payment for rent", :value =>
200)
      @expense.transactions << Transaction.new(:t_date =>
Date.civil(2010,02,01), :description => "Payment for rent", :value =>
100)
      @expense.actual.should == BigDecimal('600')
end

The actual method in expense looks like this:
  def actual
    transactions.sum('value')
  end

I have noticed that I have to save @expense for this to work, why is
that?
Are the transactions saved when I assign them to the saved @expense
using << ?
Is there a better way to write this test, perhaps without hitting the
database?

My second question is with regards to this line:
@expense.actual.should == BigDecimal('600')

Is that a common way of testing BigDecimal?
What is considered best practices when dealing with this?

Thanks, Daryn

Hi

I have the following test:

it "calculates the actual expenditure per month" do
@expense = Expense.new(:name => "rent", :limit => 100.50)
@expense.save
@expense.transactions << Transaction.new(:t_date =>
Date.civil(2010,01,05), :description => "Payment for rent", :value =>
300)
@expense.transactions << Transaction.new(:t_date =>
Date.civil(2010,01,10), :description => "Payment for rent", :value =>
200)
@expense.transactions << Transaction.new(:t_date =>
Date.civil(2010,02,01), :description => "Payment for rent", :value =>
100)
@expense.actual.should == BigDecimal('600')
end

The actual method in expense looks like this:
def actual
transactions.sum('value')
end

I have noticed that I have to save @expense for this to work, why is
that?

because the sum method on an association always does "Select
sum(column_name) from ..." so if the objects are unsaved then nothing
is found (Active record's sum method hides the ruby sum method).
If the expense object isn't saved then the transactions can't be saved
since expense_id is not known)

Fred