【问题标题】:Testing a method provided by autoload with Test::More使用 Test::More 测试自动加载提供的方法
【发布时间】:2012-01-03 19:28:00
【问题描述】:

我有一个工厂类,它通过使用自动加载提供了一堆类似的方法。对于不同对象类型的更长列表,它可以执行以下操作

Factory->objects();
Factory->object(23);
Factory->object(name => "foo");

现在我想为这个类写一个测试。我从这样的事情开始:

use Test::More;

BEGIN { use_ok 'Factory' }

my $objects = Factory->objects;

# more tests following ...

测试在Factory->objects 行中失败,因为它隐式检查Factory 是否可以执行objects()。我找不到这方面的一些文档。但是,如果我在非测试脚本中运行相同的调用,它会完美运行。

如何测试这个?

更新: ARGH,我刚刚意识到我将所有这些都放在了我的 Catalyst 应用程序中的 Factory 模型类的测试中。好吧,这个模型类是我的外部模型(我实际上打算测试)中Factory 类的一个适配器。这项工作非常适合模型本身。仍然希望知道如何从改编的课程中测试方法。这是适配器类的样子:

package MyCatalystApp::Model::Factory;
use Moose;

extends 'Catalyst::Model';
extends 'Catalyst::Model::Adaptor';

__PACKAGE__->config(class => 'MyModel::Factory');

MyModel::Factory 与原始问题中的Factory 是同一类。为了简化,我跳过了 Catalyst 和原始问题中的模型之间的区别。

【问题讨论】:

    标签: perl testing autoload catalyst


    【解决方案1】:

    您只需在调用测试之前添加“use Factory;”(在use_ok 之后)。

    【讨论】:

    • 作为一个注释 - 我很确定它会起作用,但基于我对 Test::More 的有限但非平凡的知识,我不太明白为什么 use_ok 不能很好地发挥作用使用自动加载器。我希望有更多线索的人(Schwern?)可以添加更明确的答案
    • 我测试了它,但它对我不起作用。 ATM 我正在​​尝试构建一些简短的示例代码来重现该问题。
    • 现在测试工作了,你的建议真的没有任何区别。
    • @halo - 现在这更有意义(正如我在第一条评论中指出的那样)
    【解决方案2】:

    Catalyst 在 setup_components 期间通过调用 COMPONENT 方法来实例化模型(组件)。我猜 Catalyst::Model::Adaptor 依赖于这种情况。

    当你 use MyCatalystApp::Model::Factory 时,你可以在测试中调用 my $factory = MyCatalystApp::Model::Factory->COMPONENT() 而不是 new() 来让它们工作。

    【讨论】:

      猜你喜欢
      • 2013-08-22
      • 2018-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-07
      • 2015-11-01
      • 1970-01-01
      • 2022-01-02
      相关资源
      最近更新 更多