Fed up with Rails fixtures? (part one)
Posted by James Mead Thu, 10 Aug 2006 04:09:00 GMT
In a previous post I explained why I’m not a big fan of Rails fixtures. But how can you avoid using them and still obtain good test coverage? Try forgetting about fixtures and writing unit tests that only test a single class and nothing else. Here’s an example where you hardly1 need to involve the database at all…
class Initial < ActiveRecord::Migration
def self.up
create_table :companies do |t|
t.column :name, :string
end
create_table :employees do |t|
t.column :company_id, :integer
t.column :salary, :integer
end
end
end
class Company < ActiveRecord::Base
has_many :employees
def wage_bill
employees.inject(0) { |total, employee| total + employee.salary }
end
end
class Employee < ActiveRecord::Base
belongs_to :company
endSo instead of writing this…
# companies.yml
walmart:
id: 1
name: Walmart
# employees.yml
fred:
id: 1
company_id: 1
salary: 10000
anne:
id: 2
company_id: 1
salary: 20000class CompanyTest < Test::Unit::TestCase
fixtures :companies, :employees
def test_should_calculate_wage_bill
assert_equal 30000, companies(:walmart).wage_bill
end
endYou can write this…
class CompanyTest < Test::Unit::TestCase
def test_should_calculate_wage_bill
employees = []
employees << Employee.new(:salary => 10000)
employees << Employee.new(:salary => 20000)
company = Company.new(:employees => employees)
assert_equal 10000 + 20000, company.wage_bill
end
endThis way you home in on the behaviour of the Company#wage_bill method and avoid testing the ActiveRecord code and access to the database. More ways to avoid hitting the database will follow in another post.
1 ActiveRecord still needs to know what columns in each table e.g.
SHOW FIELDS FROM companies
I’ve always had this nagging feeling that I did not like the fixtures, even though they seem so nice when you look at them. Good advice.
That could sure speed up some tests. The issue is when your project has tens of models with lots of relationships.
Marcus: Thanks for the positive feedback.
Damien: Are you saying there is an issue with with using fixtures or with the above technique when you have “tens of models with lots of relationships”? Our projects at Reevoo certainly come into that category and we use this technique (and many others including this) as much as we can to good effect.