我想使用模拟库来替换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
答案 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
相同的对象?