繁体   English   中英

软糖嘲笑datetime.now

[英]Fudge mocking datetime.now

我想使用mock库来替换datetime.now()结果来测试一些逻辑。 所以我现在正在使用mocker ,它运行良好,但我遇到了一些问题,也许是错误,所以我想继续更新更新的东西。 谷歌建议使用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()

one.py文件:

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

结果: fudge: nope

有任何想法吗?

Mocker的例子

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

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

这是由于您在one.py中导入datetime模块的方式 相反,试试这个:

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

这是由于Python导入工作方式而产生的问题。 如果你使用了不同的mock库,比如mock你会遇到同样的问题。

我会尝试解释,但StackOverflow中有更好的答案,我找不到我追求的那个。

from datetime import datetime时,所述datetime包被导入和datetime.datetime类引用在one.py的本地范围的约束。

但是,fudge要覆盖的名称是datetime.datetime.now() ,它与one.py上的本地绑定的名称不同,因此不会发生修补。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM