相关疑难解决方法(0)

如何在类方法中模拟python的datetime.now()进行单元测试?

我正在尝试为具有以下方法的类编写测试:

import datetime
import pytz

class MyClass:
    def get_now(self, timezone):
        return datetime.datetime.now(timezone)

    def do_many_things(self, tz_string='Europe/London'):
        tz = pytz.timezone(tz_string)
        localtime_now = self.get_now(tz)
        ...
        return things
Run Code Online (Sandbox Code Playgroud)

我想测试它,为此我需要确保datetime.datetime.now()调用返回可预测的内容.

我一直在阅读很多在测试中使用Mock的例子,但是没有发现任何我需要的东西,我无法弄清楚如何在我的测试中使用它.

我把get_now()方法分开了,以防它更容易嘲笑,而不是datetime.datetime.now(),但我仍然难倒.有关如何使用Mock为此编写UnitTests的任何想法?(这一切都在Django,fwiw;我不确定这是否会对这种情况产生影响.)

python testing django unit-testing mocking

38
推荐指数
4
解决办法
2万
查看次数

如何使用 ExpressionWrapper 使用今天和 DateField 之间的差异来注释查询集

我正在尝试根据 DateField 对查询集进行注释,如图所示。

我使用的是 Django 版本 1.8.12 和 MYSQL 版本 5.6.40。

尝试遵循如何用自创建以来的天数注释查询集,但这里它是一个 DateTimeField。下面的评论说“将其更改为 Value(now.date(), DateField()) - F('creation_date__date'),不起作用”

型号代码如下所示:

class Holding(models.Model):
    trans_date = models.DateField(_("Trans. Date"), null=False)
    ...
Run Code Online (Sandbox Code Playgroud)

给出错误持续时间的注释查询如下所示:

today = timezone.now().date()
testqs = Holding.objects.filter(id=1)
myqs = testqs.annotate(duration = ExpressionWrapper( Value(today, DateField()) - F('trans_date'), output_field=DurationField()))
Run Code Online (Sandbox Code Playgroud)

当我尝试打印时,我得到的只是“无”。打印差异以供参考。

for i in myqs:
    print i.duration, '-', today-i.trans_date

None - 1224 days, 0:00:00
None - 1206 days, 0:00:00
None - 1144 days, 0:00:00
None - 1051 days, 0:00:00
None - 1045 days, 0:00:00
Run Code Online (Sandbox Code Playgroud)

我希望持续时间是一个 …

django annotate django-queryset datefield

5
推荐指数
1
解决办法
1504
查看次数