1

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

有任何想法吗?

嘲笑者的例子

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

4

1 回答 1

3

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

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

这是由于 Python 导入的工作方式而出现的问题。如果您使用不同的模拟库(例如mock.

我会尝试解释,但在 StackOverflow 的某个地方有更好的答案,我找不到我想要的答案。

使用时from datetime import datetimedatetime会导入包并将datetime.datetime类引用绑定在one.py的本地范围内。

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

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

于 2013-01-22T12:33:35.883 回答