假设项目中有两个包: some_package
和 another_package
。
# some_package/foo.py:
def bar():
print('hello')
# another_package/function.py
from some_package.foo import bar
def call_bar():
# ... code ...
bar()
# ... code ...
我想测试一下 another_package.function.call_bar
嘲笑 some_package.foo.bar
因为它有一些我想避免的网络I / O.
这是一个测试:
# tests/test_bar.py
from another_package.function import call_bar
def test_bar(monkeypatch):
monkeypatch.setattr('some_package.foo.bar', lambda: print('patched'))
call_bar()
assert True
令我惊讶的是它输出 hello
代替 mock
。我试着在测试中调试ipdb断点这个东西。我手动导入时 some_package.foo.bar
在断点和通话之后 bar()
我明白了 patched
。
在我的真实项目中,情况更加有趣。如果我在项目根目录中调用pytest,我的函数不会被修补,但是当我指定时 tests/test_bar.py
作为一个论点 - 它的作用。
据我所知,它与the有关 from some_package.foo import bar
声明。如果在monkeypatching发生之前执行它,那么它的修补失败。但是在上面示例的精简测试设置中,修补在两种情况下都不起作用。
为什么在遇到断点后它在IPDB REPL中工作?