考虑以下方法:
在你的Moose类中定义一个名为
make_request
的“抽象”方法。然后定义两个角色来实现
make_request
- 一个调用
Foo::Request->new
,另一个调用
Test::MockObject->new
。
例如:
你的主类和这两个角色:
package MainMooseClass;
use Moose;
...
package MakeRequestWithFoo;
use Moose::Role;
use Foo::Request;
sub make_request { Foo::Request->new(...) }
package MakeRequestWithMock;
use Moose::Role;
use Test::MockRequest;
sub make_request { Test::MockRequest->new(...) }
如果你想测试你的主类,可以将它与'MakeRequestWithMock'角色混合使用:
package TestVersionOfMainMooseClass;
use Moose;
extends 'MainMooseClass';
with 'MakeRequestWithMock';
package main;
my $test_object = TestVersionOfMainMooseClass->new(...);
如果您想将其与“make_request”的Foo实现一起使用,请将其与“MakeRequestWithFoo”角色混合在一起。
一些优点:
您只会加载您需要的模块。例如,类TestVersionOfMainMooseClass
将不会加载模块Foo::Request
。
您可以将与make_request
实现相关/必需的数据作为新类的实例成员添加。例如,您原来使用CODEREF的方法可以使用此角色实现:
package MakeRequestWithCodeRef;
use Moose::Role;
has request_builder => (
is => 'rw',
isa => 'CodeRef',
required => 1,
);
sub make_request { my $self = shift; $self->request_builder->(@_) };
使用这个类需要为
request_builder
提供一个初始化器,例如:
package Example;
use Moose;
extends 'MainMooseClass';
with 'MakeRequestWithCodeRef';
package main;
my $object = Example->new(request_builder => sub { ... });
作为最后的考虑,你编写的角色可能可用于其他类。