# Ruby on Rails Fixtures

**URL:** <https://www.ruby-forum.com/t/ruby-on-rails-fixtures/80472>\
**Category:** Rails\
**Created:** [December 27, 2006, 1:38pm UTC](https://www.ruby-forum.com/t/ruby-on-rails-fixtures/80472 "2006-12-27T13:38:18Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![asa](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/dfb087/32.png) [@asa](https://www.ruby-forum.com/u/asa)\
**Post date:** [December 27, 2006, 1:38pm UTC](https://www.ruby-forum.com/t/ruby-on-rails-fixtures/80472/1 "2006-12-27T13:38:18Z")

</div>

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!

---

<div class="post-metadata">

**Author:** ![asa](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/dfb087/32.png) [@asa](https://www.ruby-forum.com/u/asa)\
**Post date:** [December 27, 2006, 7:49pm UTC](https://www.ruby-forum.com/t/ruby-on-rails-fixtures/80472/2 "2006-12-27T19:49:22Z")

</div>

> 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

---

<div class="post-metadata">

**Author:** ![asa](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/dfb087/32.png) [@asa](https://www.ruby-forum.com/u/asa)\
**Post date:** [December 27, 2006, 11:03pm UTC](https://www.ruby-forum.com/t/ruby-on-rails-fixtures/80472/3 "2006-12-27T23:03:56Z")

</div>

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](http://www.agilewebdevelopment.com/rails-ecommerce)

---

<div class="post-metadata">

**Author:** ![asa](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/dfb087/32.png) [@asa](https://www.ruby-forum.com/u/asa)\
**Post date:** [December 30, 2006, 10:11am UTC](https://www.ruby-forum.com/t/ruby-on-rails-fixtures/80472/4 "2006-12-30T10:11:29Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![asa](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/dfb087/32.png) [@asa](https://www.ruby-forum.com/u/asa)\
**Post date:** [December 27, 2006, 8:25pm UTC](https://www.ruby-forum.com/t/ruby-on-rails-fixtures/80472/5 "2006-12-27T20:25:29Z")

</div>

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") %\>
