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