上下文
假设我有一些相互继承的模块(使用{ - 1}}和base
的老式继承,而不是Moose或类似的)。 parent
继承Foo::Bar
,Foo
继承Foo::Bar::Baz
。所有这些模块都有使用Foo::Bar
编写的测试套件。子类的测试套件仅测试它实现的方法。子类不一定会覆盖其父项中的所有方法,尽管它们可能会添加其父项没有的新方法。
问题:
是否有一些测试框架,技术或Test::More
功能,我可以编写测试,不仅测试子类特定的行为,还会为任何继承的行为/父类运行测试套件?基本上,我正在寻找允许我为子类的唯一/特殊行为编写测试的东西,但也会测试并确保子类在测试中的行为方式与其父类的预期相同。
我尝试了什么:
我用一个生成器方法编写了一个非常简单的测试工具,该方法构建了一个字符串指定模块的实例,并根据所请求的模块类型运行测试(有一个跟踪子类的中心哈希/超类层次结构),但这似乎很粗糙。我假设(就像我在Perl中需要做的大多数事情一样),其他人已经以更加优雅和健壮的方式做到了这一点。
答案 0 :(得分:2)
您要找的是Test::Class
。
您可以为Foo::Bar
创建一个测试类,我可能会将其称为Test::Foo::Bar
。此Perl模块将使用Test::Class
作为其基类。但不是直接测试Foo::Bar
,而是通过以下方法访问它:
sub class {'Foo::Bar'}
这允许我们稍后覆盖它。
然后,您创建一个继承自Test::Foo::Bar::Baz
的新测试类Test::Foo::Bar
。通过这样做,您可以自动继承您为父类编写的所有测试。当然你需要覆盖class():
sub class {'Foo::Bar::Baz'}
瞧!您现在正在Test::Foo::Bar
Foo::Bar::Baz
上运行所有测试,您可以自由地覆盖或重新测试内容。
Chromatic在他的博客上有一个完整的例子:Resuing Test Code with Test::Class
你对已经存在的测试工具你是对的。 Test::Class
,Test::Harness
和prove
的混合应该照顾您的需求,并且没有理由自己编写。