NAME

Test::DBIx::Class::Schema - DBIx::Class schema sanity checking tests

VERSION

version 1.0.12

SYNOPSIS

Create a test script that looks like this:

#!/usr/bin/perl
# vim: ts=8 sts=4 et sw=4 sr sta
use strict;
use warnings;

# load the module that provides all of the common test functionality
use Test::DBIx::Class::Schema;

# create a new test object
my $schematest = Test::DBIx::Class::Schema->new(
    {
        # required
        dsn       => 'dbi:Pg:dbname=mydb', # or use schema option
        namespace => 'MyDB::Schema',
        moniker   => 'SomeTable',
        # optional
        username  => 'some_user',
        password  => 'opensesame',
        glue      => 'Result',             # fix class name if needed
        # rather than calling diag will test that all columns/relationships
        # are accounted for in your test and fail the test if not
        test_missing => 1,
    }
);

# tell it what to test
$schematest->methods(
    {
        columns => [
            qw[
                id
                column1
                column2
                columnX
                foo_id
            ]
        ],

        relations => [
            qw[
                foo
            ]
        ],

        custom => [
            qw[
                some_method
            ]
        ],

        resultsets => [
            qw[
            ]
        ],
    }
);

# run the tests
$schematest->run_tests();

Run the test script:

prove -l t/schematest/xx.mydb.t

Options

Either dsn (eg dbi:Pg:dbname=mydb) or schema (an already created schema object) must be set.

If the database requires credentials, set username and password.

namespace, glue and moniker define the class being tested. For example, if your class is MyDB::Schema::Result::SomeTable then use:

namespace => 'MyDB::Schema',
glue      => 'Result,
moniker   => 'SomeTable',

glue is not required if the combination of namespace and moniker is enough to define the class, e.g. MyDB::Schema::SomeTable.

done_testing

Under normal circumstances there is no need to add done_testing to your test script; it's automatically called at the end of run_tests() unless you are running tests under Test::Aggregate.

If you are running aggregated tests you will need to add

done_testing;

to your top-level script.

If you are running under Test::Class::Moose or Test::Class you will need to disable this behaviour manually as there is no way to detect it. To do that, set $ENV{TEST_AGGREGATE} = 1 before calling run_tests or your test suite might blow up.

DESCRIPTION

It's really useful to be able to test and confirm that DBIC classes have and support a known set of methods.

Testing these one-by-one is more than tedious and likely to discourage you from writing the relevant test scripts.

As a lazy person myself I don't want to write numerous near-identical scripts.

Test::DBIx::Class::Schema takes the copy-and-paste out of DBIC schema class testing.

SEE ALSO

DBIx::Class, Test::More, Test::Aggregate

AUTHOR

Chisel Wright <chisel@chizography.net>

COPYRIGHT AND LICENSE

This software is copyright (c) 2017 by Chisel Wright.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.

CONTRIBUTORS

  • Darius Jokilehto <darius.jokilehto@net-a-porter.com>

  • Dave Cross <davidc@broadbean.com>

  • Jason Tang <tang.jason.ch@gmail.com>

  • Rupert Lane <rupert@rupert-lane.org>

  • simbabque <simbabque@cpan.org>