I’ve got a date property for a model called ‘transaction’, when I save it I want to check if it’s within a range and if not then set the date to the previous transaction.
It’s working but I cannot seem to get my test working, it keeps bombing out when adding the error. Is there a way to stub the ‘errors.add’ line out so I can isolate my test to check if the tran_date value has changed correctly?
def tran_date_within_financial_year
range = ledger.fin_start..ledger.fin_end
unless range === tran_date
tran = Transaction.all.order("created_at").last
self.tran_date = tran.tran_date
errors.add(:tran_date, "is outside financial year")
end
end
Here is my test
context "date is empty" do
it "should set date to previous transaction" do
@prev_tran = Transaction.make!(:tran_date => Date.new(2012,02,03))
@tran = Transaction.make!(:tran_date => "")
@tran.save
@tran.reload.tran_date.should eq(@prev_tran.tran_date)
end
end
The result when running rspec is:
1) Transaction Saving a transaction date is empty should set date to previous transaction
Failure/Error: @tran = Transaction.make!(:ledger => ledger, :tran_date => "")
ActiveRecord::RecordInvalid:
Validation failed: Tran date is outside financial year
However if I comment out the error.add function then my test passes. So it is setting the value correctly to the previous transaction date. The problem is the errors.add stops the test all together.
Well, the spec simply emphasises that you can’t save an invalid object.
And the object is invalid because you add errors to it.
These specs should pass: