有没有办法在催化剂中使用测试数据库

dfl*_*wer 5 perl catalyst

使用催化剂时,有没有办法像在Rails中那样指定开发,测试和生产数据库?我查看了文档,但我没有找到答案.

小智 4

参考 cpan Catalyst 测试教程

您可能希望为您的实时应用程序维护一个“生产数据库”,并为您的测试用例维护一个“测试数据库”。

模型类中的数据库配置切换

一种解决方案是允许使用环境变量覆盖数据库规范。例如,在编辑器中打开 lib/MyApp/Model/MyAppDB.pm 并将 __PACKAGE__->config(...声明更改为类似:

my $dsn = $ENV{MYAPP_DSN} ||= 'dbi:SQLite:myapp.db';
__PACKAGE__->config(
    schema_class => 'MyAppDB',
    connect_info => [
        $dsn,
        '',
        '',
        { AutoCommit => 1 },

    ],
);
Run Code Online (Sandbox Code Playgroud)

然后,当您运行测试用例时,您可以使用以下命令:

$ cp myapp.db myappTEST.db
$ CATALYST_DEBUG=0 MYAPP_DSN="dbi:SQLite:myappTEST.db" 证明 --lib lib -vt/live_app01.t

这只会在测试用例运行时修改 DSN。如果您在未定义 MYAPP_DSN 环境变量的情况下启动普通应用程序,它将默认为与以前相同的 dbi:SQLite:myapp.db。

使用多个配置文件进行数据库配置切换

通过利用Catalyst::Plugin::ConfigLoader的功能根据环境变量加载多个配置文件,您可以覆盖默认(生产)数据库连接设置。

在测试脚本中将 $ENV{ MYAPP_CONFIG_LOCAL_SUFFIX } 设置为“testing”会导致在 myapp.conf 之后加载名为 myapp_testing.conf 的附加配置文件,该文件将覆盖 myapp.conf 中的所有参数。

您应该在测试脚本的 BEGIN 块中设置环境变量,以确保在启动 Catalyst 应用程序之前设置它。

以下是名为 MyDB 的 DBIx::Class 模型和名为 Foo 的控制器的配置和测试脚本示例:

myapp_testing.conf:

<Model::MyDB>
    <connect_info>
        dsn dbi:SQLite:myapp.db
    </connect_info>
</Model::MyDB>
Run Code Online (Sandbox Code Playgroud)

使用单独的数据库时还要检查这一点