Lew*_*ett 8 php phpunit class-design
我正在设计一个有两个依赖项的类.其中一个依赖类已经编写和测试.另一个还没写.
它发生在我身上,因为剩余的依赖关系将被编写以方便将要使用它的类,我应该首先编写后者,然后设计前者的接口,学习它应该做什么.
在我看来,这是制作代码的好方法.毕竟,只要主类在其构造函数中得到一个mock,我就可以编写它并在不知道它的依赖性不存在的情况下测试它,然后我可以创建依赖项,一旦我确定我知道我需要什么.
那么:我该怎么做?创建一个我修改的骨架类.也许是这样的:
class NonExistantSkeleton
{
public function requiredMethod1()
{
}
public function newlyDiscoveredRequirement()
{
}
}
Run Code Online (Sandbox Code Playgroud)
然后使用PHPUnit模拟它,并设置存根等,以保持我的课程开发愉快?
这是要走的路吗?
这似乎是开发代码的好方法 - 在我看来比开发依赖更有意义,而不确定它将如何被使用.
是.至少那就是我现在正在做的事情.
如果在您正在构建的课程的测试中,您所在班级的预期合作者不存在,您可以选择以下几种方法:
如果您对接口进行编程,那么您需要做的就是创建该接口并告诉PHPUnit从中创建存根/模拟
在模拟非现有类时,你会遇到一些我不喜欢的缺点:
所以我建议反对.
该中间道路是只创建空的类骨架,其方法和使用那些嘲讽.
我非常喜欢这种方式,在没有接口提示的情况下,因为它很快并且创建稳定的测试代码.
对我来说,使用公共api的准系统课程并不违反TDD.
数据传输对象和值对象始终可以使用new生产代码中的任何位置创建,因此您的测试也可以只是真实对象.
它有助于保持您的测试更清洁,因为您不需要模拟/期望很多getter/setter方法等等.
如果您遵循测试驱动的开发方法,那么通常的方法如下:
编辑:正如edorian指出的那样,PHP接口在这里是一个巨大的帮助,因为PHPUnit可以从接口和类生成模拟和存根.它们也是减少耦合和改善可替代性的优秀工具.它们允许您替换实现预期接口的任何类,而不仅仅是期望类的子类.