【发布时间】:2011-02-14 01:22:12
【问题描述】:
假设我们有一个类UserService,其属性为current_user。假设在AppService类中使用。
我们为AppService 提供了测试。在测试设置中,我们使用一些模拟值将 current_user 存根:
UserService.current_user = 'TestUser'
假设我们决定将current_user 重命名为active_user。我们将其重命名为 UserService,但忘记在 AppService 中更改其用法。
我们运行测试并且它们通过了!测试设置添加了current_user 属性,它仍然(错误但成功地)在AppService 中使用。
现在我们的测试没用了。他们通过了,但应用程序将在生产中失败。
我们不能依赖我们的测试套件 ==> TDD 是不可能的。
TDD 在 Python 中被破坏了吗?
【问题讨论】:
-
您无法在 Python 中进行 TDD!= Python 中的 TDD 已损坏。
-
这是你设置你的模拟值的方式被破坏了,你应该使用普通的 UserService 构造函数来设置 current_user (或实际应用程序中的任何更改),而不是使用这个快捷方式。
-
@Pierreten,最好告诉我我做错了什么
-
@Luper Rouch,
UserService构造函数不能接受用户,current_user实际上是一个属性 getter,它从环境中检索当前用户(例如,当前 http 上下文) -
然后写
UserService.current_user = "TestUser"用字符串覆盖property,您的测试不再反映生产条件。正确的方法是修改属性返回的内容,例如通过设置它通常返回的环境变量。
标签: python unit-testing refactoring tdd mocking