我决定在我的项目中使用TDD方法。首先,我将重点放在用例的一小部分上:
验证AccessCode。
AccessCode是Julian格式的日期,如果它小于或等于今天,则有效。
第1步:编写测试
def test_should_validate_accessdate(self):
assert application.is_accessdate_valid(56746)
第2步:运行失败
完成。
第3步:让测试通过 在application.py中,
def is_accessdate_valid(accessdate):
return True
第4步:运行传递
完成。
第5步:重构
没有什么可以重构的。但是,硬编码的返回值很糟糕。
现在,重复:
第1步:编写新测试
def test_should_invalidate_accessdate(self):
assert not application.is_accessdate_valid(54990)
第2步:运行失败
完成。
第3步:让测试通过 在这种情况下,硬编码的返回值是一种痛苦。所以,我需要删除它,而不是概括一些逻辑让测试通过。
def is_accessdate_valid(accessdate):
today_julian = julian_to_julian5(calendar_to_julian(datetime.utcnow()))
return accessdate >= today_julian
我不确定我是否做了正确的事情,只需一步迈出这么大的一步。但是,我没有看到任何其他方法使测试通过而不会失败其他测试。 欢迎提出建议。
第4步:运行以通过测试
完成。
步骤5:运行以通过所有测试
完成。
最初,我很自豪我能够通过首先为它编写测试来定义函数,然后通过更多的测试来对其进行整形。
但是,后来我意识到,检查有效访问日期的测试将在今天的日期越过输入accessdoday的日期后开始失败。
我能做的一件事是提供一个动态计算的输入访问日期:
1.在今天的日期添加一两天
2.将上述结果日期转换为朱利安格式
3.使用上面的Julian结果作为输入访问日期。
然而,有些事情感觉不对。
我是否走在正确的道路上? 还是我在某个地方误入歧途? 或者首先是功能设计错误,假设我应该选择不同的签名?
欢迎任何建议或抨击。
答案 0 :(得分:2)
您不想编写与时间相关的单元测试。因此,编写相对于作为参数的日期的测试 - 因此保持不变 - 或者使用jonrsharpe提到的模拟方法。这使您只能确定用于确定时间相关组件的机制是否有效,而不是逻辑是否有效。
这也适用于其他环境事物 - 机器名称,目录路径名,历史股票价格等。