php - 在为该对象编写类之前为该对象编写模拟/ stub ?

标签 php phpunit class-design

我正在设计一个具有两个依赖项的类。已编写并测试了其中一个依赖类。另一个还没写。

我想到,因为将编写剩余的依赖项以方便将要使用它的类,所以我应该先编写后者,并在进行过程中设计前者的界面,了解它应该做什么。

在我看来,这是编写代码的好方法。毕竟,只要主类在其构造函数中获得模拟,我就可以编写它并对其进行测试,而不会意识到它的依赖项不存在,然后一旦我确定我知道我需要什么,我就可以创建依赖项.

那么:我该怎么做呢?创建一个骨架类,我会在进行过程中对其进行修改。也许是这样的:

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 objectsValue Objects始终可以在您的生产代码中使用 new 创建任何地方,因此您的测试也可以只是真实对象

它有助于让您的测试更简洁一些,因为您不需要模拟/期望大量的 getter/setter 方法等。

关于php - 在为该对象编写类之前为该对象编写模拟/ stub ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8907777/

相关文章:

php - Cakephp beforeFilter 与构造函数

php - 无法使用 php 从数据库中删除特定行

c++ - 避免对实现接口(interface)的类进行多个几乎相同的声明

c++ - 有没有办法设计两个私下操作彼此数据的类?

javascript - 设置测验模块的时间限制

php - 在 CakePHP 中为连接表的列创建验证规则

php - SF2 功能测试 : "Resetting the container is not allowed when a scope is active"

PHP 单元测试 : should tests be under the same namespace as the class?

php - 如何将一组测试用例发送到 PHPUnit willReturnOnConsecutiveCalls

java - 非公共(public)顶级类与静态嵌套类