python - Fudge mock datetime.now

标签 python unit-testing

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

相关文章:

python - 递归添加到集合

c# - Rhino Mock Partial Stub 必须是公共(public)方法吗?

node.js - 使用 should 时测试未显示通过

python - 如何使用python wave模块调整音高

python - Python中继承的抽象类上的`__subclasshook__`?

Python:为什么从CSV文件中获取某列数据的函数只能返回第一次数据?

python - 用 Python 中另一个 JSON 文件中的相应值替换 JSON 值

unit-testing - 我如何将其分解为单元测试?

java - JUnit 测试对象的静态计数器

java - 测试场景分离