Как развернуть тестовую базу данных для класса DBIx

У меня есть приложение Mojolicious с набором тестов с использованием Test::Class::Moose. Используя DBIx::Class для взаимодействия с моей базой данных, есть ли способ настроить базу данных в памяти, к которой я могу добавить данные о приборах?

Я хотел бы использовать базу данных в памяти, потому что это будет означать, что приложение будет иметь меньше настроек конфигурации. Я знаю, как настроить реальную базу данных SQLite для тестирования, но управление ею для тестирования вместе с базой данных mySQL для производства не похоже на простое управление (например, "о нет, забыл перестроить тестовую базу данных").

Загрузка данных из приборов кажется идеальной, так что вы можете лучше контролировать то, что на самом деле находится в базе данных. Например, вы находите ошибку со строкой, содержащей определенные данные, добавляете такую ​​строку в файл фикстуры и тестируете до успешного завершения.

Теперь, как на самом деле настроить базу данных в памяти, используя DBIx?:)

Прямо сейчас вот как я строю схему для моего набора Test:: Class:: Moose:

has cats => (
    is => 'ro',
    isa => 'Test::Mojo::Cats',
    default => sub { return Test::Mojo::Cats->new(); }
);

has schema => (
    is => 'ro',
    lazy => 1,
    builder => '_build_schema_and_populate',
);

sub _build_schema_and_populate {
    my $test = shift;
    my $config = $test->cats->app->config();
    my $schema = Cat::Database::Schema->connect(
        $config->{db_dsn},
        $config->{db_user},
        $config->{db_pass},
        {
            HandleError => DBIx::Error->HandleError,
            unsafe => 1
        }
    );

    require DBIx::Class::DeploymentHandler;
    my $dh = DBIx::Class::DeploymentHandler->new({
        schema  => $schema,
        sql_translator_args => { add_drop_table => 0 },
        schema_version => 3,
    });
    $dh->prepare_install;
    $dh->install;

    my $json = read_file $config->{fixture_file};
    my $fixtures = JSON::decode_json($json);

    $schema->resultset($_)->populate($fixtures->{$_}) for keys %{$fixtures};

    return $schema;
}

Где мой конфиг указывает dbi:SQLite:dbname=:memory: в качестве базы данных DSN.

При запуске набора тестов таблицы, кажется, не загружаются, так как я получаю сообщения об ошибках, утверждающих, что таблица не существует, например, Can't locate object method "id" via package "no such table: cats"

Есть ли какие-то дополнительные настройки, которые я не выполняю при развертывании в базе данных в памяти?

Спасибо

PS:

Выполнение следующих работ в одном скрипте, я не знаю, делаю ли я что-то, что Test:: Class:: Moose или Mojo не нравится с вышеупомянутым

#!/usr/bin/perl

use Cats::Database::Schema;
use File::Slurp;
use JSON;
use Data::Dumper;

my $schema = Cats::Database::Schema->connect(
    'dbi:SQLite:dbname=:memory:', '', ''
);

my $json = read_file('../t/fixtures.json');
my $fixtures = JSON::decode_json($json);

$schema->deploy();
$schema->resultset($_)->populate($fixtures->{$_}) for keys %{$fixtures};

# returns fixture data fine
# warn Dumper($schema->resultset('User')->search({}));

1 ответ

Я думаю, я понял это

Я использую схему DBIx в приложении, чтобы создать ее экземпляр в базовом контроллере, который наследуют все подчиненные контроллеры. Независимо от того, как я построил и заполнил базу данных в памяти в объекте Test::Class::Moose, он не будет использовать указанный там экземпляр, вместо этого он будет использовать тот, который указан в базовом контроллере.

решение состояло в том, чтобы переместить конструкцию схемы на один уровень (от контроллера до корня приложения) в качестве атрибута, что позволило мне переопределить ее в Test Mojo, чтобы использовать базу данных в памяти.

Другие вопросы по тегам