2013-07-20 50 views
2

语境:如何使用Test :: More和朋友自动测试继承行为?

说我有相互继承几个模块(使用老派的继承与baseparent,不驼鹿或类似)。 Foo::Bar继承FooFoo::Bar::Baz继承Foo::Bar。所有这些模块都有用Test::More编写的测试套件。子类的测试套件只测试它实现的方法。子类不一定会覆盖其父母中的所有方法,尽管他们可能会添加父母不具备的新方法。

问:

有一些测试框架,技术或Test::More功能与我可以写测试,不仅要测试的具体子类的行为,但也将随后运行任何继承的行为测试套件/父类以及?基本上,我正在寻找一些东西,它允许我为子类的独特/特殊行为编写测试,但也会测试并确保子类在测试中的行为与预期的父类相同。

我已经试过:

我已经写了与建立一个字符串指定模块的实例,并取决于什么类型的模块运行测试反对发电机方法非常简单的测试工具被请求(有一个中央哈希,保持跟踪子类/超类层次结构),但这似乎很粗糙。我假设(像我在Perl中需要做的大多数事情),其他人已经以更加优雅和稳健的方式做到了这一点。

回答

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'} 

瞧!您现在在Foo::Bar::Baz上运行Test::Foo::Bar的所有测试,并且您可以自由覆盖或对自己的内容进行新的测试。

色在他的博客彻底例如:Resuing Test Code with Test::Class

你说得对已有的测试工具。 Test::Class,Test::Harnessprove的混合物应该照顾你的需求,而且没有什么理由写你自己的。