perl - 如何为 DBIx 类部署测试数据库

标签 perl testing automated-tests dbix-class test-class

我有一个 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:猫”

当我想部署到内存数据库时,是否有一些我没有做的额外设置?

谢谢

附言:

在单个脚本中执行以下操作,我不知道我是否在做 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({}));

最佳答案

我相信我想通了

我在应用程序中使用 DBIx 架构的方式是在所有子 Controller 继承的基本 Controller 中实例化它。无论我如何在 Test::Class::Moose 对象中构建和填充内存数据库,它都不会使用那里指定的实例,而是使用基本 Controller 中指定的实例。

解决方案是将模式构造作为属性向上移动一个级别(从 Controller 到应用根目录),允许我在 Test Mojo 中覆盖它以使用内存数据库。

关于perl - 如何为 DBIx 类部署测试数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33452074/

相关文章:

javascript - 在 mocha 测试中使用 done 和 setTimeout 的简单示例未按预期工作

android - 如何使用 gradle 1.12 生成 html 报告?

javascript - Protractor:已解决的 promise 仍被拒绝

testing - 自动化服务器运行的 Testcafe 测试随机失败

php - 在 PHP 脚本中调用时无法通过 Perl 建立 MySQL 连接

Perl - 无法访问 Excel 文件

laravel - 如何测试 laravel 连续作业?

perl - 无法在 conda 环境中通过 cpanm 安装 perl 模块

perl - 使用语句或函数作为值的键散列?

scala - FakeRequest withMultipartFormDataBody "Missing boundary header"