Answers:
好消息是您意识到被测代码需要帮助。与其立即实施,不如创建一个接口并使用模拟来确保您的测试正确输入了代码。通过这些测试后,您可以继续执行其依赖的代码。
X
我必须知道X
需要模拟依赖的哪一部分。我觉得这是实现细节的一部分,不应该是测试的一部分,否则我可能需要在重构实现时更改测试。我应该为此担心吗?
存根和模拟可用于模拟尚未修改/实现的功能。它们还可以帮助您解决导致这种“链式反应”的依赖性。
另一方面,最好只进行一次(失败)测试以驱动下一个更改。
可以暂时禁用其他针对依赖新功能的代码的测试,因为它们在此时并没有真正的意义。在您的情况下,请禁用X的测试,直到实现Y等。
我认为这样一来,您就可以只专注于您想要的下一个更改。
unittest
已经跳过了测试。这对我来说可能就足够了。
临时看来,这里可能存在两个独立的问题:
您忘记了一些故事和测试场景,直到开始处理特定的测试场景时才发现它们,和/或
您实际上是在进行单元测试,而不是TDD 功能测试
对于#1,请停止,返回并更新故事和测试方案,然后从其他方案重新开始。
对于#2,请停止,并记住您正在测试功能而不是单元,因此请使用模拟掩盖其他接口和/或实施更多代码以使测试通过而不添加新的测试方案。假定您没有丢失测试场景,而是(实际上很常见)混合单元测试和TDD。
对于TDD和我来说,这是一个很大的问题,对我来说是巨大的挫败感。我感觉在这种情况下TDD缺乏,您无法在开始开发之前就不知道需要哪些较低级别的组件或功能。
我个人发现,TDD仅在您完全知道执行某项功能所需的内容以及调用该功能所需的内容后才能起作用。开发人员在开始之前并不总是了解所有内容,因此我发现减轻自己所描述情况的最佳方法是:
原型
当我制作简单的原型应用程序以探索和发现技术问题的方法时,我会发现很多相关工作,并在开始之前就将这些研究排除在外。设计和估算也变得容易得多。
如果原型必须涉及到它成为应用程序,那么我敦促您不要懒惰,而是在事后为原型构建单元测试。
届时,您应该对低级API有所了解,并能够在高级别组件中成功模拟低级API。