我想使用模拟库来替换datetime.now()
的结果来测试一些逻辑。所以我现在使用 mocker
并且它工作得很好,但是我遇到了一些问题,也许是错误,所以我想继续更新一些东西。 Google 建议使用 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文件:
from datetime import datetime, timedelta
class ClassName(object):
def one(self):
return datetime.now()
结果:捏造:不
有什么想法吗?
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
),您也会遇到同样的问题。
我会尝试解释一下,但 StackOverflow 中的某个地方有更好的答案,但我找不到我想要的答案。
当使用from datetime import datetime
时,datetime
包被导入,并且datetime.datetime
类引用被绑定(bind)在本地范围内one.py。
fudge 被赋予覆盖的名称是 datetime.datetime.now()
,它与 one.py 上的本地绑定(bind)是不同的名称,所以不会发生修补。
换句话说,当 test_fudge()
运行并且它正在寻找修补名称 datetime.datetime.now
时,它如何知道 one.py 中的 datetime
名称在运行时与 datetime.datetime
引用相同的对象?
关于python - Fudge mock datetime.now,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14454184/