【问题标题】:Test Driven Development and KISS测试驱动开发和 KISS
【发布时间】:2019-07-09 19:44:18
【问题描述】:

例如我想设计一个Job 实体。作业有状态,我需要将Job 标记为完成

我写了一个markDone() 方法,我想测试一下。因此,要进行断言,我还需要一种方法 - isDone()。但目前我的代码中没有使用isDone() 方法。

写这么没用的方法来讨好一个TDD可以吗?

【问题讨论】:

  • 您需要发布一些实际代码,以便我们为您提供帮助。
  • 在 TDD 中,您正在编写代码和测试,为什么要编写无用的测试?

标签: php unit-testing tdd


【解决方案1】:

写这么没用的方法来讨好一个TDD可以吗?

是的,但也许不是。

是的部分:您可以以更容易测试的方式来塑造您的设计,包括创建专门用于可观察性的方法。当您尝试构建视图以了解生产中运行的流程时,这些东西通常会派上用场。

也许不是部分:Job::status 有什么用?当该状态设置为完成时,系统中哪些可观察到的行为会发生变化?如果 Job::markDone 是空操作,会提交哪些错误?这才是你真正想要测试的东西。

例如,您可能需要能够将作业描述为 JSON 文档,并且更改作业状态会更改 JSON 中显示的值。伟大的!测试一下。

job.markDone()
json = job.asJson()
assert "DONE".equals(json.getText("status))

在领域层/业务逻辑中,对象的有趣之处在于它们如何使用隐藏的数据结构来响应查询。命令很有趣,不是因为它们改变了数据结构,而是因为改变了的数据结构会产生不同的查询结果。

【讨论】:

    【解决方案2】:

    如果该方法在测试之外没有用处,我会避免编写它,因为可能还有另一种方法可以检查工作是否完成。作业的状态是公开的,还是有返回作业状态的方法?如果是这样,我会用它来测试markDone() 是否正常工作。如果没有,您可以使用reflection 来检查私有或受保护对象属性的值。

    【讨论】:

    • 不,我避免使用 getters。所以可能只有一种解决方案 - 正如你所说的那样使用反射。
    【解决方案3】:

    `isDone()' 可以只驻留在测试项目中而不是生产代码中吗?这样一来,您就不会为了测试而拥有无用的生产代码。

    【讨论】:

    • 嗯,在这种情况下,我将不得不创建扩展实体并提供isDone-like 方法的测试存根。我认为这是开销。可能反射会更好。
    猜你喜欢
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多