非常简单的问题:
package MyApp::Model::Foo;
use Moose;
use namespace::autoclean;
extends 'Catalyst::Model';
has 'firstname' => ( is => 'ro', isa => 'Str' ); # to be populated in config file
# ...
sub check_name {
my $self = shift;
my $firstname = $self->firstname;
# ...
}
当我从测试脚本调用check_name()
时,在" $ self-> firstname"我收到错误Can't use string ("MyApp::Model::Foo") as a HASH ref while "strict refs" in use at reader MyApp::Model::Foo::firstname
。我该怎么用呢?
我无法重现测试内容,因为它过于广泛,但是当我运行测试脚本时,我已经调用了一个加载Catalyst应用程序的安装脚本(从而读取Catalyst配置文件),部署和填充数据库表等。
测试脚本在原始版本中运行良好(没有从配置文件中获取值;这是我现在尝试做的;最初我传入的值),以及相关位只是
my $name_check = MyApp::Model::Foo->check_name();
ok(defined $name_check, "Name is OK");
答案 0 :(得分:3)
您似乎想要进行某种单元测试,或者可能是集成测试,并验证您的应用程序是否从配置文件中获取了正确的数据。
催化剂组件(型号,视图和控制器)是Moose对象,您已经做到了。为了让他们拥有Moose魔法(这不是真正的魔法),你需要实例化它们。你不能只将一个访问者称为类方法。
use MyApp::Model::Foo;
my $name_check = MyApp::Model::Foo->new->check_name();
但这不起作用,因为现在您已经拥有了模型对象的 new 实例,并且它没有通过配置设置名称。
Catalyst内部负责为您创建对象,包括其配置。你说你有一个Catalyst运行。您可以使用Catalyst::Test进入,获取上下文对象$c
,然后使用model
访问器为您提供已获得配置的正确模型对象。
ctx_request
函数允许Catalyst处理请求并返回实际的HTTP::Response对象以及上下文对象。然后,您可以使用该上下文。
use Catalyst::Test 'MyApp';
use Test::More;
my ( $res, $c ) = ctx_request('/');
ok defined $c->model('Foo')->name, 'Name is defined';
您可能已经在某个地方的测试堆栈中安装了Catalyst :: Test。如果没有,你就会做一些奇怪的事情。
请注意,如果您希望会话附加到特定用户,则此功能无效,因此如果您有Test::WWW::Mechanize::Catalyst或其他具有会话Cookie的用户代理,您将需要提取cookie并构建自己的HTTP::Request对象,而不是使用用户代理cookie jar将cookie放入该请求,然后再将其传递给ctx_request
。
另请注意,您正在进行的测试不是很有用,除非您正在构建执行配置读取的代码。即使这样,您也可以构建不需要完整运行Catalyst的单元测试。