Python的MiniMock可以创建在同一文件中定义的函数的模拟吗?

Lor*_*ein 3 python mocking

我正在使用Python MiniMock库进行单元测试.我想模拟在与我的doctest相同的Python文件中定义的函数.MiniMock可以处理吗?天真的方法失败了:

def foo():
    raise ValueError, "Don't call me during testing!"

def bar():
    """
    Returns twice the value of foo()

    >>> from minimock import mock
    >>> mock('foo',returns=5)
    >>> bar()
    Called foo()
    10

    """
    return foo() * 2

if __name__ == "__main__":
    import doctest
    doctest.testmod()
Run Code Online (Sandbox Code Playgroud)

如果我尝试运行此代码,会发生以下情况:

**********************************************************************
File "test.py", line 9, in __main__.bar
Failed example:
    bar()
Exception raised:
    Traceback (most recent call last):
      File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/doctest.py", line 1212, in __run
        compileflags, 1) in test.globs
      File "<doctest __main__.bar[2]>", line 1, in <module>
        bar()
      File "test.py", line 13, in bar
        return foo() * 2
      File "test.py", line 2, in foo
        raise ValueError, "Don't call me!"
    ValueError: Don't call me!
**********************************************************************
1 items had failures:
   1 of   3 in __main__.bar
***Test Failed*** 1 failures.
Run Code Online (Sandbox Code Playgroud)

编辑:根据下面的答案,这已被确定为一个错误,并已在MiniMock中修复.

use*_*642 5

我刚刚在邮件列表上回复了一个修复此问题的MiniMock补丁.

在应用之前,而不是在itsadok的代码段中的以下两行:

>>> mock('foo',returns=5)
>>> bar.func_globals['foo'] = foo
Run Code Online (Sandbox Code Playgroud)

你也可以用

>>> mock('foo', nsdicts=(bar.func_globals,), returns=5)
Run Code Online (Sandbox Code Playgroud)