Testing database (was Re: [jifty-devel] Tutorial questions)

Henry Baragar Henry.Baragar at instantiated.ca
Thu Nov 9 09:52:04 EST 2006


Hi,

We want to use fixtures in Jifty similar to what Ruby does. We found an old 
message in the archive (below) which provides a solution.  

However, we find it easier to maintain the fixture data separately from the 
test code, particularly when there are complex linkages between the tables. 
Consequently, we have set up our system to load fixtures out of 
t/fixtures/*.yml using the following code:

use YAML "LoadFile";

# Load the fixtures
sub load_fixtures {
    for my $file (map {<t/fixtures/$_.yml>} @_) {
        my ($table) = $file =~ /(\w+)[.]yml$/;
        load_yml($table,LoadFile($file));
    }
}

sub load_yml {
    my $table = shift;
    our $dbh = MyApp::Model::Table->_handle->dbh;
    for my $row (@_) {
        my %row = %$row;
        $dbh->do(insert_statement($table, keys %row), undef, values %row)
            or die $dbh->errstr;
    }
}

sub insert_statement {
    my $table = shift;
    my $cols = join ",", @_;
    my $binds = join ",", ("?") x @_;
    "insert into $table ($cols) values ($binds)";
}

A couple of notes:

1.  We call load_fixtures as part of our setup in each test file
    as follows:
 load_fixtures(qw/model_ones model_twos/);
    or as:
 load_fixtures("model*");

2.  We create the insert_statement every time in case different fixtures
    in a file list different fields.

Regards,
Henry

On Wed Jan 4 14:10:46 EST 2006, Alex Vandiver wrote:
[stuff deleted]
> > 2) Fixtures - this is arguably the second most powerful feature of
> > ActiveRecord (which is Ruby's ORM). If given a YAML file named
> > appropriately, it will load that file into the table when asked. These
> > are generally used for testing, but are really nice to have when
> > resetting the dev database or for demos. I've also found them really
> > handy for actually fleshing out how you want the schema to work.
> Here's how we're doing this in one of our in-house Jifty apps -- this
> can certainly be made better, but it's partially there.  It's like
> making fixtures, but in code rather than a data file.
>
> package MyApp::Test;
> use base qw/Jifty::Test/;
>
> sub setup {
>   my $class = shift;
>   $class->SUPER::setup;
>
>   my $ADMIN = MyApp::CurrentUser->superuser;
>
>   my $widget = MyApp::Model::Thingy->new(current_user => $ADMIN);
>   $widget->create(
>     foo => "bar",
>     baz => "troz",
>   );
>   # And so on..
> }
>
> # You can also:
> sub test_config {
>   # Customize the config file for testing
>   my $class = shift;
>
>   my ($config) = @_;
>   my $hash = $class->SUPER::test_Config($config);
>   $hash->{framework}{LogConfig} = "some/log4perl.conf";
>   return $hash;
> }


More information about the jifty-devel mailing list