Issues with database/object caching and testing


#1

Hi all,

I just burned two hours of development time trying to debug this issue.
Can someone please tell me if there is a way to disable database caching
when running unit tests or another way to avoid running into this type
of problem??

This does not work:
assert periods(:period1).ongoing? # Asserts true
plays(:end_of_first_half).process # Ends the period
assert !periods(:period1).ongoing? # Asserts false

This DOES work:
assert periods(:period1).ongoing? # Asserts true
plays(:end_of_first_half).process # Ends the period
assert !Period.find(periods(:period1).id).ongoing? # Asserts true

I’ve only just now run into this issue after dozens of tests. Am I
missing something obvious about expected behavior?


#2

Ricky B. wrote:

Hi all,

I just burned two hours of development time trying to debug this issue.
Can someone please tell me if there is a way to disable database caching
when running unit tests or another way to avoid running into this type
of problem??

This does not work:
assert periods(:period1).ongoing? # Asserts true
plays(:end_of_first_half).process # Ends the period
assert !periods(:period1).ongoing? # Asserts false

This DOES work:
assert periods(:period1).ongoing? # Asserts true
plays(:end_of_first_half).process # Ends the period
assert !Period.find(periods(:period1).id).ongoing? # Asserts true

I’ve only just now run into this issue after dozens of tests. Am I
missing something obvious about expected behavior?

I have run into this same problem, but don’t understand it either. To be
safe, I always do a find on the object first, but wish I had a more
reliable solution to this as well.

I too have wasted lots of debugging time only to find it was just an
issue with my test code!


#3

On Mar 18, 3:48 am, Ricky B. removed_email_address@domain.invalid
wrote:

assert !periods(:period1).ongoing? # Asserts false

This DOES work:
assert periods(:period1).ongoing? # Asserts true
plays(:end_of_first_half).process # Ends the period
assert !Period.find(periods(:period1).id).ongoing? # Asserts true

I don’t know exactly what this code is doing, but activerecord does
cache associations and so on (and fixtures are only loaded once per
test when you do periods(:period1). There’s no easy way to disable
this, periods(:period1).reload.ongoing? is a little less ugly than
other alternatives.

Fred