Ruby on Rails Fixtures


#1

When I use test fixtures to populate test data into mysql database I am
running into an unexpected behavior. Only columns explicitly defined in
the fixture is populated into the database. However, created_on,
created_by, updated_on, updated_by fields along with all fields
normally populated by observers are NULL. For example, I have a couple
fields that have their values calculated via observers. I want to test
that these calculations are performed correctly by the observer, so I
don’t want to hard code their values in the fixture.

Has anyone else run into this issue? If so, how did you perform testing
of these fields? I realize that I could perform these tests without
fixtures by creating and saving the object. Behind the scenes, Active
Record populates all the fields in the expected manner. Then I could
find the saved record and assert_equal the expected calculations.
However this approach seems brittle and I rather use fixtures. It
doesn’t seem (from the results) that I am getting that the fixtures
functionality uses Active Record to serialize data to mysql.

Thanks!


#2

Only columns explicitly defined in the fixture is populated into the database.

I think this is the expected behavior. This way you can set fields to
the exact values you want for testing purposes. If those fields were
automatically populated (based off the system time when the tests were
run?) then your tests would be slightly different each time they ran
and thus potentially brittle.

I realize that I could perform these tests without fixtures by creating and saving the object.

I think this is a reasonable approach in this case but I am interested
to hear if anyone else has suggestions.

Chris Eagan


#3

On Dec 27, 2006, at 10:50 AM, Jon G. wrote:

were
run?) then your tests would be slightly different each time they ran
and thus potentially brittle.

Correct. I use the following format in my fixtures to set these
fields
to times relative to when the test is run.

created_on: <%= 2.days.ago.strftime("%Y-%m-%d %H:%M:%S") %>

You could also do this…
created_on: <%= 2.days.ago.to_formatted_s(:db) %>


Building an e-commerce site with Rails?
http://www.agilewebdevelopment.com/rails-ecommerce


#4

created_on: <%= 2.days.ago.strftime("%Y-%m-%d %H:%M:%S") %>
created_on: <%= 2.days.ago.to_formatted_s(:db) %>

this one is shorter/simpler :

 created_at: <%= 2.days.ago.to_s :db %>

Alain


#5

removed_email_address@domain.invalid wrote:

Only columns explicitly defined in the fixture is populated into the
database.

I think this is the expected behavior. This way you can set fields to
the exact values you want for testing purposes. If those fields were
automatically populated (based off the system time when the tests were
run?) then your tests would be slightly different each time they ran
and thus potentially brittle.

Correct. I use the following format in my fixtures to set these fields
to times relative to when the test is run.

created_on: <%= 2.days.ago.strftime("%Y-%m-%d %H:%M:%S") %>