上下文:
假设我有一些相互继承的模块(使用带有 base
和 parent
的老式继承,而不是 Moose 或类似的继承)。 Foo::Bar
继承Foo
,Foo::Bar::Baz
继承Foo::Bar
。所有这些模块都有用 Test::More
编写的测试套件。子类的测试套件仅测试它实现的方法。子类不一定覆盖其父类中的所有方法,尽管它们可能会添加其父类没有的新方法。
问题:
是否有一些测试框架、技术或 Test::More
功能,我可以使用它们编写测试,这些测试不仅可以测试子类特定的行为,而且还可以为任何继承的运行测试套件行为/父类也是如此?基本上,我正在寻找一些东西,它允许我为子类的独特/特殊行为编写测试,但也会测试并确保子类在测试中的行为与其父类预期的行为相同。
我尝试过的:
我用生成器方法编写了一个非常简单的测试工具,该方法构建字符串指定模块的实例,并根据请求的模块类型对其运行测试(有一个中央哈希来跟踪子类/父类(super class)层次结构),但这看起来很粗糙。我假设(就像我需要在 Perl 中做的大多数事情一样),其他人已经以更优雅和更健壮的方式完成了这项工作。
最佳答案
您正在寻找的是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
中的所有测试,并且可以自由覆盖或进行新测试随心所欲。
Chromatic 在他的博客上有一个完整的示例:Resuing Test Code with Test::Class
您对已经存在的测试工具的看法是正确的。 Test::Class
、Test::Harness
和 prove
的混合应该可以满足您的需求,并且没有什么理由编写你自己的。
关于perl - 如何使用 Test::More 和 friend 来自动测试继承的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17767518/