我有一个 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/