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