软糖嘲笑datetime.now

时间:2013-01-22 08:17:26

标签: python unit-testing

我想使用模拟库来替换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

1 个答案:

答案 0 :(得分:3)

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

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

由于Python导入的工作方式,这是一个问题。如果使用其他模拟库(例如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相同的对象?