【发布时间】:2015-03-20 10:51:50
【问题描述】:
如果我正在编写一个接口,我通常会指定实现应该公开的行为。为了确保这种行为,应该针对这个接口编写测试。我如何最好地编写和组织这些测试,以便实现的编写者可以轻松地使用它们来确保他们的实现满足要求? 是某种扩展(编写子类)接口测试的方法还是我实现了一些设计模式,比如工厂?
【问题讨论】:
-
由于 PHP 接口不能包含实际代码,您要测试什么?实际上,您所能做的就是确保定义了特定的方法,并以某种方式让它们接受某些参数,也许使用反射
-
我想测试实现的行为,但我不想为每个实现一次又一次地编写相同的测试,因为对于外部世界,它们看起来都应该是一样的,因为它们是实现相同的接口。例如。可以编写接口
XYZ并根据测试,所以每个想要声明“我正在实现接口 XYZ”的人只需将测试应用于这里的实现。 -
如果您定义了接口,并且定义了将接口作为参数的方法,那么您已经在那里了。遗憾的是,php 接口没有指定完整的方法签名(例如缺少返回类型),因此您永远无法确定如何使用代码:
a_function(my_interface $obj) { $obj->method_defined_in_interface(); /*what's the return type here, can I used it with str_* functions as I wanted or did it return void/int/obj/....? */}。另一方面:如果您在相同的代码库中有实现:改为测试它们,接口已经类型提示。 -
这个想法是不要求所有实现都在同一个代码库中。尤其是正确的返回类型可以通过这些测试用例进行测试。
-
FWIW,我明白你想要做什么,我认为这是一个好问题。接口只是定义了一个方法应该的样子,它不能确认它实际上工作超出了表面的方法签名之外的你想要的方式。将实现测试与接口捆绑在一起似乎非常明智,因此实现者可以确认他们的工作;特别是如果该方法应该计算一些复杂的东西。也许您可以使用配置文件,例如“在此处添加您的课程,我们将为它运行测试”。
标签: php unit-testing testing interface