我正在设计一个具有两个依赖项的类。已编写并测试了其中一个依赖类。另一个还没写。
我想到,因为将编写剩余的依赖项以方便将要使用它的类,所以我应该先编写后者,并在进行过程中设计前者的界面,了解它应该做什么。
在我看来,这是编写代码的好方法。毕竟,只要主类在其构造函数中获得模拟,我就可以编写它并对其进行测试,而不会意识到它的依赖项不存在,然后一旦我确定我知道我需要什么,我就可以创建依赖项.
那么:我该怎么做呢?创建一个骨架类,我会在进行过程中对其进行修改。也许是这样的:
class NonExistantSkeleton
{
public function requiredMethod1()
{
}
public function newlyDiscoveredRequirement()
{
}
}
然后使用 PHPUnit 模拟它,并设置 stub 等,让我的类在开发中保持快乐?
这是要走的路吗?
这似乎是一种开发代码的好方法 - 在我看来,这比开发依赖项更有意义,而无需真正确定它将如何使用。
最佳答案
简而言之:
是的。至少那是我现在正在做的事情。
加长版:
如果您的类(class)的预期合作者在您正在构建的类(class)的测试中需要他们的时间点不存在,您有一些选择:
- 模拟不存在的类(phpunit 可以做到)
- 创建类骨架并模拟它们
- 只需创建接口(interface)并为它们获取模拟(phpunit 也可以这样做)
- 根据对象的不同,您可能不需要以上任何一项
如果您针对接口(interface)编程,无论如何您需要做的就是创建该接口(interface)并告诉 PHPUnit 从中创建 stub /模拟
- +不考试不上新课
- +在适当的时候使用接口(interface)被认为比仅仅暗示类更好/更好
当模拟不存在的类时,您会遇到一些我不喜欢的缺点:
- -模拟维护成本高
- -更改该类的方法既缓慢又乏味
- -如果你创建了类,你应该再次修改模拟
所以我反对这样做。
中间方法 是只创建带有方法的空类骨架,并将它们用于模拟。
在没有接口(interface)提示的情况下,我非常喜欢这种方式,因为它速度很快,而且可以创建稳定的测试代码。
对我来说,使用带有公共(public) API 的准系统类并不违反 TDD。
有些类您不需要模拟。
Data transfer objects和 Value Objects始终可以在您的生产代码中使用 new
创建任何地方,因此您的测试也可以只是真实对象。
它有助于让您的测试更简洁一些,因为您不需要模拟/期望大量的 getter/setter 方法等。
关于php - 在为该对象编写类之前为该对象编写模拟/ stub ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8907777/