NAME
Class::DBI::Test::TempDB - Maintain a SQLite database for testing CDBI
Version
Version 1.0
Synopsis
package Music::TempDB;
use base qw/Class::DBI::Test::TempDB/;
__PACKAGE__->build_test_db();
END {
__PACKAGE__->tear_down_connection();
# remove the db file at unload time
}
1;
# ...Meanwhile, somewhere in Music::CD:
=begin testing
use Music::TempDB;
# have our class use the test db:
Music::TempDB->connect_class_to_test_db('Music::CD');
# create some data in our test db:
my $cd = Music::CD->create({
title => "Jimmy Thudpucker's Greatest Hits",
year => 1978
});
# make sure it looks right:
is($cd->year, 1978, 'year');
# etc.
# ... when done testing, delete data:
$cd->delete();
=end testing
Description
In testing, we generally want tests to create and destroy all their own data. When writing Class::DBI-based projects, it's helpful to have a test database in which to do this, so that we can (a) be sure we're not stepping on production data, and (b) be sure of exactly what data is in the test database at the beginning/end of each test.
Class::DBI::Test::TempDB handles the creation and destruction of a temporary SQLite database on disk; it also allows you to point your Class::DBI classes at the test database. You can then get on with creating, testing and destroying test data simply by interacting with your Class::DBI classes.
The database can be persistent between tests, or it can be recreated for each test, from a YAML file describing the schema to be created. It can be stored in a temp file, or in a file with a user-supplied name.
Everything is done through class methods and subclassing.
Methods
build_connection
If supplied a parameter, that parameter is used as the name of a database file to be built (or connected to, if it already exists). If not, creates a temporary file (using File::Temp). Once the file is created, this method initializes a SQLite db in it, and points our package connection at it.
dsn
Returns the string 'dbi:SQLite:dbname=' . <the name of the database file being used>
tear_down_connection
Removes the database file, if it still exists.
connect_class_to_test_db
Overrides the db_Main() method of the passed-in CDBI entity class so that it calls our db_Main() instead. This is the methodology suggested by the CDBI documentation for dynamically changing a class's database connection. NB the warnings there about already-existing instances of the entity class: that is, this should probably only be done at the beginning of a test script, before any objects have been instantiated in the entity class.
build_test_db
MyClass::DBI::Test->build_test_db(<$yaml, $dbfile>);
Given the path to a YAML file representing the schema of our production database, generate a test SQLite database and use it.
By default, $yaml is 'config.yaml' and $dbfile is a temp file (we use File::Temp, which see for details).
The YAML file is expected to be in the format produced by SQL::Translator (which see for details); here's an example of a way to produce such a YAML file from a MySQL database called 'mydatabase':
mysqldump -d mydatabase | perl -MSQL::Translator -e
'my $sql = join "", <STDIN>; my $trans = SQL::Translator->new;
print $trans->translate(from => "MySQL", to => "YAML", data => $sql);'
> config.yaml
See Also
Class::DBI, SQL::Translator, File::Temp
Limitations
Of course, this module can only handle things that SQLite can handle.
Author
Dan Friedman, <lamech@cpan.org>
Acknowledgements
Thanks to Kirrily "Skud" Robert for early design input.
Thanks to Tony Bowden for module naming help.
Lots of ideas were taken from the testsuite that accompanies Class::DBI.
Bugs
Please report any bugs or feature requests to bug-class-dbi-test-tempdb@rt.cpan.org
, or through the web interface at http://rt.cpan.org. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.
Copyright & License
Copyright 2004 Dan Friedman, All Rights Reserved.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.