perl - 如何使用 Test::More 和 friend 来自动测试继承的行为?

标签 perl unit-testing inheritance polymorphism test-more

上下文:

假设我有一些相互继承的模块(使用带有 baseparent 的老式继承,而不是 Moose 或类似的继承)。 Foo::Bar继承FooFoo::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::ClassTest::Harnessprove 的混合应该可以满足您的需求,并且没有什么理由编写你自己的。

关于perl - 如何使用 Test::More 和 friend 来自动测试继承的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17767518/

相关文章:

JavaScript继承,重置原型(prototype)构造函数?

perl - 在 Perl 中逐字符解析字符串

unit-testing - 遵循 TDD 时如何处理内存泄漏

inheritance - Backbone .js 模型继承

Java:是否可以说变量类型必须满足多重继承/接口(interface)要求

python - 为什么 assertRaises 不使用 python unittest 捕获我的属性错误?

perl - 如何在 PerlMagick 中居中字幕?

regex - 如何在 Perl 中替换现有文件中的字符串

正则表达式 - 挤压空格并删除名称中的点

reactjs - 如何使用 React 测试库编写测试来检查悬停是否更改了组件样式?