【问题标题】:Python: Unit testing for date changesPython:日期更改的单元测试
【发布时间】:2010-12-15 00:28:04
【问题描述】:

我为 Django 表单定义做了以下事情(尴尬,是的):

class DealAdvancedSearchForm(forms.Form):
    weekday_choices = [
        ['monday', 'Monday'],
        ['tuesday', 'Tuesday'],
        ['wednesday', 'Wednesday'],
        ['thursday', 'Thursday'],
        ['friday', 'Friday'],
        ['saturday', 'Saturday'],
        ['sunday', 'Sunday'],
    ]
    weekday_index = date.today().weekday()
    weekday_choices[weekday_index][1] += ' (Today)' 
    weekday_choices[weekday_index+1][1] += ' (Tomorrow)'
    weekday = forms.ChoiceField(label='Day of the week', choices=weekday_choices, required=False)

您现在可能已经猜到了,只要date.today() 没有改变,它就可以正常工作。我所有的测试都通过了。但是,一旦日期更改,它会错误地将初始日期的选择标记为今天。

我后来发现这是多么愚蠢,并将代码移到 __init__ 方法中。

现在我想为它写一个测试。有谁知道当日期更改时我将如何测试正确的工作日标记为(Today)

【问题讨论】:

    标签: python django unit-testing testing


    【解决方案1】:

    索引越界错误:

    Watch out for [weekday_index+1] for 'sunday', 
    use [(weekday_index+1)%7] to wrap down to 0.  
    

    将选择提取到一个方法中,以便于测试。如果该方法只包含python而没有django,那么测试起来会更容易,也更容易理解。我也同意你应该创建一个 __init__today 可以在今天结束时改变,并且需要随之改变。

    def weekday_choices(self, todays_index):
        ...
        return choices_list
    

    编辑:

    • 目前您的代码只运行一次。
    • 将逻辑移动到对实例而不是类级别进行操作。
    • 使用像MiniMock 这样的库来模拟来自 date.today().weekday() 的响应。
      • date.today() 将需要返回一个将使用returns_iter 的模拟。
    • 实例化 2 个表单并断言它们的选择列表符合预期。
      • 一个用于今天的日期,一个用于明天。
    • 您也可以模拟模数测试。

    【讨论】:

    • +1 表示模数建议。但是,我想要测试如果日期更改会发生什么。
    • @NimmyLebby,我添加了一些关于 MiniMock 的信息。一个非常有用的工具来帮助进行测试。
    • 我不能再 +1 了,但我明天晚上会深入探讨这个问题。听起来很中肯的建议。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-29
    • 2021-11-09
    • 1970-01-01
    • 2018-12-18
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多