软糖嘲笑日期时间

2024-05-16 01:39:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用模拟库来代替datetime.now()的结果来测试一些逻辑。所以我现在使用mocker,它工作得很好,但是我遇到了一些问题,可能是bug,所以我想继续更新一些内容。谷歌建议使用fudge所以。。。我不能让它嘲笑datetime.now()

from one import ClassName
def test_fudge():
    import fudge

    @fudge.patch('datetime.datetime.now')
    def a(dtn):
        dtn.expects_call().returns(1)
        print 'fudge:', 'yep' if ClassName().one() == 1 else 'nope'
    a()
test_fudge()

在一个.py文件:

^{pr2}$

{cd5>结果:^

有什么想法吗?在

模拟示例

import mocker
from one import ClassName
m = mocker.Mocker()
n = m.replace('datetime.datetime')
n.now()
m.result(123)
with m:
    print ClassName().one()

一个.py是一样的。 结果:123


Tags: frompytestimportdatetimedef逻辑one
1条回答
网友
1楼 · 发布于 2024-05-16 01:39:47

这是由于您在中导入datetime模块的方式造成的一个.py。相反,请尝试以下方法:

import datetime
class ClassName(object):
    def one(self):
        return datetime.datetime.now()

这是一个由于Python导入的工作方式而产生的问题。如果使用不同的模拟库,例如mock,您也会遇到相同的问题。在

我会尽力解释,但在StackOverflow里有更好的答案,我找不到我想要的那个。在

当使用from datetime import datetime时,datetime包被导入,datetime.datetime类引用被绑定在的本地范围内一个.py。在

但是fudge被赋予重写的名称是datetime.datetime.now(),它与上的本地绑定不同一个.py,因此不会发生修补。在

换句话说,当test_fudge()运行并且它正在寻找修补名称datetime.datetime.now,它如何知道中的datetime名称一个.py在运行时引用与datetime.datetime相同的对象?在

相关问题 更多 >