perl - Moose 类的依赖注入(inject)

标签 perl dependency-injection moose

我有一个 Moose 类需要发送类型为 Foo::Request 的请求.我需要让这个依赖可以从外部访问,这样我就可以轻松地在测试中交换请求实现。我想出了以下属性:

has request_builder => (
    is => 'rw',
    isa => 'CodeRef',
    default => sub {
        sub { Foo::Request->new(@_) }
    }
);

然后在代码中:
my $self = shift;
my $request = $self->request_builder->(path => …);

在测试中:
my $tested_class = …;
my $request = Test::MockObject->new;
$request->mock(…);
$tested_class->request_builder(sub { $request });

有没有更简单/更惯用的解决方案?

最佳答案

使用 Moose::Util::apply_all_roles 在测试中动态应用角色怎么样?我一直想用这个有一段时间了,但还没有借口。这是我认为它会起作用的方式。

首先,稍微修改您的原始属性:

package MyClientThing;
has request => (
    is      => 'rw',
    isa     => 'Foo::Request',
    builder => '_build_request',
);
sub _build_request { Foo::Request->new };
....

然后创建一个 Test::RequestBuilder 角色:
package Test::RequestBuilder;
use Moose::Role;
use Test::Foo::Request; # this module could inherit from Foo::Request I guess?
sub _build_request { return Test::Foo::Request->new }; 

同时在 't/my_client_thing.t' 你会写这样的东西:
use MyClientThing;
use Moose::Util qw( apply_all_roles );
use Test::More;

my $client  = MyClientThing->new;
apply_all_roles( $client, 'Test::RequestBuilder' );  

isa_ok $client->request, 'Test::Foo::Request';

Moose::Manual::Roles了解更多信息。

关于perl - Moose 类的依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7118388/

相关文章:

perl - 将 MooseX 元属性与 Moops 结合使用

perl - 无法弄清楚如何在 perl 中修复此脚本

regex - 如何修复我的正则表达式以使其与贪婪的量词不匹配?

perl - 映射中的not_analyzed被忽略

mysql - Perl UTF8 CGI 和 DBI ... 正确的工作流程是什么?

delphi - Spring4d - 具有服务名称的自动工厂

java - Spring单例服务和原型(prototype)方法查找注入(inject)

perl - 驼鹿(Perl): Is it okay to use %$object to get the data representation of an object for serialization?

c# - 返回抽象泛型类型的适当具体类型

perl - 在 Moose 子例程中,$meta 是如何进入 @_ 的?