【问题标题】:How do I test my plug-in interface which uses an abstract class?如何测试使用抽象类的插件接口?
【发布时间】:2026-01-17 08:40:01
【问题描述】:

我使用的是 PHP 5.3 和 SimpleTest,但欢迎提供更一般的答案。每个插件都将是一个扩展抽象类的类......我如何测试这个接口是否正常工作?我必须创建几个插件并测试它们吗?还是有更满意的方式?

例如,想象写一些东西来代表金钱。用户可以使用不同的货币类别对其进行扩展。

抽象类Money
{
私有静态 $symbol;
私人静态 $num_decimals;

公共函数 __construct($amount) { ...}
公共函数 __toString() { ... }
}

那么插件应该是这样的:

GBPound 类扩展了 Money
{
私有静态 $symbol = "£";
私有静态 $num_decimals = 2;
}

也许我可以模拟多重继承,扩展 UnitTest 类和 money 类,但这可能会变得一团糟!

这太难了,因为单元测试就是测试接口,而类本身就是插件接口。

【问题讨论】:

  • 有什么问题?为什么不能只测试GBPound 类?
  • 因为我想测试创建GBPound 类或任何其他类组合的能力。如果该班级在安哥拉有用户,我希望他们能够使用该界面创建一个ANKwanza 班级。
  • 为什么还需要英镑? GBPound 并没有那么特别,不能仅用 Money 来表示。只需制作构造函数所需的 $symbol 和 $num_decimals 参数并将它们存储为非静态即可。此外,您可能希望将 Money 重命名为 Currency。
  • 这只是一个例子。我的实际插件界面与钱无关,只是解释起来要复杂得多。

标签: php unit-testing abstract-class simpletest


【解决方案1】:

我决定通过创建一个空插件类来测试接口的想法。对我来说,这似乎比模拟一个抽象类要干净得多。 (但是由于其他原因,我正在将所有测试迁移到 PHPUnit。)

【讨论】:

    【解决方案2】:

    不确定 simpletest,但 PHPUnit 可以创建抽象类的模型,让您可以直接测试它们。

    【讨论】:

    • 感谢您的回答。我仍然不完全确定测试会是什么样子。静态变量是为每个插件静态设置的,不能更改。我想测试:static::$symbol="£" 和 static::$num_decimals=2, self::toString()=="£3.24"。我能想到的唯一方法是创建一个或两个纯粹用于测试目的的插件。
    • 测试static::$symbol="£" 是没有意义的,因为这将测试PHP 本身是否工作,这不是你的工作。您需要假设它有效,并且您的类的用户将正确扩展它。您的测试应集中在测试 __toString() 方法上,这可以通过创建“假”插件或使用 PHPUnit 生成模型的能力来完成。
    • 是的,我就是这个意思。因此 = 而不是 ==。应该添加 $obj->amount=3.24 (或任何接口)。我会看看 PHPUnit。我最初决定反对它(这是我在 PHP 中的第一个 TDD 项目),因为我想快速启动并运行,而且 PHPUnit 看起来比 SimpleTest 有更陡峭的学习曲线。
    最近更新 更多