Skip to content

szarski/Fixturized

Repository files navigation

fixturized Build Status

Fixturized makes your tests' data generation take less time.

Remember how fast fixtures used to work? But they were really painfull if you added one more after_save in your model - that filled some field in - and you had to update your fixture files.

FactoryGirl for instance is awesome because it gives you extreme flexibility. But it is also very slow if you save a lot of records to your db.

Fixturized is a solution in between fixtures and whatever you want, which means it will generate fixtures out of your FactoryGirl (or whatever you use) calls and refresh them if anything changes.

installation

gem install fixturized

usage

Let's say you want to speed up an existing test.

Test case like:

describe User do
  before :each do
    @user = Factory :user
    @dog = Factory :dog
  end

  it "should know the dog's name" do
    @user.get_dog @dog
    @user.dog_name.should == @dog.name
  end
end

Becomes:

describe User do
  before :each do
    fixturized do |o|
      o.user = Factory :user
      o.dog = Factory :dog
    end
  end

  it "should know the dog's name" do
    @user.get_dog @dog
    @user.dog_name.should == @dog.name
  end
end

the way it works

When fixturized gets a block it:

  • check if fixtures exist for this block

If so:

  • clears the database
  • loads database content and variables

If not:

  • clears the database
  • runs the fixturized block
  • dumps db content
  • saves variable values

The first run will be slightly slower than usualy.

Each time the block's been changed, fixturized will generate the fixture for this particular block from stretch.

If you change your models in a way that affects their database layouts, you can just

rm fixturized/*
and it will create all the fixtures once again.

drawbacks

There are two main problems with fixturized:

  • you can not stack fixturized blocks (each erases the database)
  • instead of using instance variables you need to use the Fixturized::Wrapper's methods:
  @user = Factory :user

becomes:

  fixturized do |o|
    o.user = Factory :user
  end

compatibility

Fixturized consits of several classes, each responsible for interactions with different interfaces:

  • DatabaseHandler - clears database, dumps db, loads db content, loads db records
  • FileHandler - reads and writes YAML files
  • Runner - runs the fixturized block, determines whether fixtures are up to date, hooks up the Wrapper
  • Wrapper - loads and saves all the data from the block using the rest of the modules

These classes currently support ActiveReord with an sql database and classic YAML fixtures. To use different software you just need to replace one of the classes.

Copyright

Copyright (c) 2010 Jacek Szarski. See LICENSE for details.

About

in between fixtures and whatever you want

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages