第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何凍結(jié) datetime.now 以進(jìn)行單元測試

如何凍結(jié) datetime.now 以進(jìn)行單元測試

ITMISS 2023-03-01 16:54:19
我有一個使用函數(shù)返回默認(rèn)日期時間的模型:class Company(models.Model):    q1_results_date = models.DateField(        verbose_name='Q1 financial results',        default=quarter_results_date(1),        blank=False,        null=False,    )def quarter_results_date(month):    return datetime.datetime(        datetime.datetime.now().year,        month,        calendar.monthrange(datetime.datetime.now().year, month)[1]    )我想對此進(jìn)行單元測試,這需要我將 datetime.now() 設(shè)置為已知值。為此,我正在使用freezegun.freeze_time:def test_quarter_results_date(self):    with freeze_time("2012-01-14"):        print('check datetime.now()', datetime.now())        c = Company.objects.create()    ...但是,盡管print語句顯示2012-01-14,但日期時間并未凍結(jié),因為它在計算時仍使用今天的日期c1.q1_results_date。我該如何糾正這個問題?
查看完整描述

1 回答

?
胡子哥哥

TA貢獻(xiàn)1825條經(jīng)驗 獲得超6個贊

這不起作用的原因是因為您調(diào)用了該函數(shù)。因此,這意味著datetime在解釋類時對 進(jìn)行求值,所以這基本上是在您啟動服務(wù)器時進(jìn)行的。在那一刻,冷凍槍還沒有激活。


因此,這也意味著如果您稍后運行服務(wù)器一段時間,并且年份增加,它仍將使用舊值。


您可以將可調(diào)用對象傳遞給默認(rèn)值,從而使用輔助函數(shù),例如:


def quarter_results_date(month):

    yr = datetime.datetime.now().year

    __, dy = calendar.monthrange(yr, month)

    return datetime.datetime(

        yr,

        month,

        dy

    )


def quarter_results_date_first():

    return quarter_results_date(1)


class Company(models.Model):

    q1_results_date = models.DateField(

        verbose_name='Q1 financial results',

        default=quarter_results_date_first,

        blank=False,

        null=False,

    )

請注意, 沒有使用括號default=quarter_results_date_first,因此我們將引用傳遞給函數(shù),而不是日期時間值。


查看完整回答
反對 回復(fù) 2023-03-01
  • 1 回答
  • 0 關(guān)注
  • 157 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號