Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 测试Moose和MooseX::FollowPBP生成的方法需要多少?_Perl_Testing_Tdd_Moose - Fatal编程技术网

Perl 测试Moose和MooseX::FollowPBP生成的方法需要多少?

Perl 测试Moose和MooseX::FollowPBP生成的方法需要多少?,perl,testing,tdd,moose,Perl,Testing,Tdd,Moose,我想开始严格执行测试驱动开发。然而,我想知道我应该测试Moose和MooseX::FollowPBP生成的方法多少。例如,我有以下课程: package Neu::Series; use Moose; use MooseX::FollowPBP; use File::Find::Wanted; has 'file_regex' => ( isa=>'RegexpRef', is=>'rw', default => sub{

我想开始严格执行测试驱动开发。然而,我想知道我应该测试Moose和MooseX::FollowPBP生成的方法多少。例如,我有以下课程:

package Neu::Series;
use Moose;
use MooseX::FollowPBP;

use File::Find::Wanted;

has 'file_regex' => (
    isa=>'RegexpRef',
    is=>'rw',
    default => sub{
                 qr{
                   [A-Z]       #Uppercase letter
                   [a-zA-Z]*   #any letter, any number of times
                   [-]         #dash
                   (           #open capturing parenthesis
                   [0-9]
                   [0-9]
                   [0-9]
                   [0-9]
                   [a-zA-Z]?   #any letter, optional
                   )           #close capturing parenthesis
               }xms;
           },
);


has 'top_dir' => (
    isa=>'Str',
    is=>'rw',
);


has 'access' =>(
    isa=>'Neu::Access',
    is=>'ro',
    required=>1,

);

1;
我当前的测试脚本是:

use strict;
use warnings;
use Test::More tests => 8;
use Neu::Access;

BEGIN{ use_ok('Neu::Series'); }

can_ok( 'Neu::Series', 'new');
can_ok( 'Neu::Series', 'set_file_regex');
can_ok( 'Neu::Series', 'get_file_regex');
can_ok( 'Neu::Series', 'set_top_dir');
can_ok( 'Neu::Series', 'get_top_dir');
can_ok( 'Neu::Series', 'get_access');

my $access = Neu::Access->new(dsn => 'test');
my $series_worker = Neu::Series->new(access => $access);

isa_ok($series_worker, 'Neu::Series');
这是否足够或太多的测试?(也就是说,除了明显缺少正则表达式的测试之外)


我以为我在某个地方看到了关于此的网页或其他帖子,但今天找不到它。

检查所有访问器是否正确生成没问题。。。但是,您还可以在稍高的级别上测试其他内容,例如,为什么不测试属性是否正确生成

use Test::Deep;
my @attrs = Neu::Series->meta->get_all_attributes;
cmp_deeply( [ map { $_->name } @attrs ], superbagof(qw(file_regex top_dir access)));

我会专注于测试我的规范。我有没有告诉驼鹿我想要它做什么

为此,我将从以下测试开始:

  • 验证读/写属性同时具有访问器和变异器
  • 验证只读属性是否具有访问器而没有变异器
  • 测试任何类型约束和强制。确认只能设置可接受的值。如果一个属性sIf希望
    VII
    被视为
    Str
    ,并被强制为
    Int
    作为
    7
    ,则测试该属性是否存在

测试访问器是否正确生成实际上毫无意义。如果没有,您将很快发现,因为您编写的任何实际测试都将失败

Moose本身测试访问器是否正确生成,使用类的Moose是否获得构造函数,等等。使用依赖关系的要点之一是,您可以专注于编写和测试应用程序,而不是帮助程序代码


我同意道蟾蜍的观点,你自己编写的约束和强制可能值得测试。

谢谢戴夫、道蟾蜍、以太、艾略特和布赖恩。通过阅读您的答案、评论和博客,似乎有两个显著的要点:

(1) 不需要测试来确保驼鹿完成它应该做的事情。我想大家都同意这一点

(2) 测试Moose生成的方法适合于建立、测试和维护您的界面。大多数人都同意这一点

再次感谢大家的投入

编辑:


这只是一个社区维基摘要。请阅读个人答案和评论。

感谢您向我介绍
Test::Deep
!看完你的答案后,我去看了一下文档,对它印象深刻。我还印象深刻的是,
Test::Deep::NoTest
将允许您在非测试情况下进行所有相同的比较。我喜欢您为测试目的查询元类的想法。当我认为这使得测试本身依赖于Moose时,我停顿了一下,如果我选择放弃驼鹿作为我的项目(那可能性太大)会发生什么?使用黑盒测试来验证特定方法是否存在并正确运行(以更复杂的测试为代价),还是使用元类信息来反省类并直接验证规范更好?@daotoad:我想这是一个你是否认为你可能会离开Moose的问题,以及您对每一个驼鹿版本的信任度。各种重构需要更改单元测试是很常见的,因为Moose的安装过程非常可靠,所以我只需测试属性的存在性,然后继续测试类的实际实现(不涉及Moose的应用程序逻辑)。在测试复杂的角色组合时,我在$work中使用了特定于元的测试,其中很可能缺少属性。这太棒了!感谢您和Moose团队的其他成员。我同意,编写概括Moose详尽的测试集的测试毫无意义,但我坚持我的建议,验证访问器和变异器。我相信麋鹿会照我说的去做——麋鹿总是照我写的去做。然而,我不相信自己能告诉驼鹿我想要它做什么。当您真正想要
ro
时,将
rw
放在属性中非常容易。这些测试应该尽可能简单——它们测试规范,而不是功能。我写了一篇关于这个主题的文章。你没有正确测试Moose生成的访问器。您正在测试是否与外部世界保持相同的接口。仅仅因为一个方法目前是作为Moose访问器实现的,并不意味着它将永远以这种方式实现。始终测试整个界面,而不管是谁创建的。我强烈反对戴夫的观点,因为艾略特和道蟾蜍已经概述了所有的原因。谢谢你的回答。你说得对,我应该自己测试所有可能出错的东西。